2

我正在使用两个表运行 sql 查询,即QuestionInsertQuestion_Papers。各表中的列如下:-

Table:-QuestionInsert  
Columns:-QuestionNum,Question,Answer,CatId,SubCatId

Table:-Question_Papers  
Columns:-QuestionNum
  1. 我想要一个 sql 查询,它将从表 QuestionInsert 中检索所有 QuestionNum、Question、Answer,其中 QuestionNum 存在于表 Question_Papers 中。
  2. 另外,我想从表 QuestionInsert 中检索所有 QuestionNum、Question、Answer 表 Question_Papers 中不存在 QuestionNum。

此数据显示在网格视图上。我使用的查询如下:- 第一个条件的查询是:

SELECT F.QuestionNum,
       F.Question,
       F.Answer 
FROM QuestionInsert F 
INNER JOIN Question_Papers FS ON F.[QuestionNum]=FS.QuestionNum 
WHERE ((F.QuestionNum=FS.QuestionNum) AND (F.CatId='" + 
DropDownList1.SelectedValue + "' And F.SubCatId='" + DropDownList3.SelectedValue + "'))  
ORDER BY F.QuestionNum DESC;

第二个条件的另一个查询。是:-

SELECT F.QuestionNum,
       F.Question,
       F.Answer 
FROM QuestionInsert F INNER JOIN Question_Papers FS ON F.[QuestionNum]!=FS.QuestionNum 
WHERE ((F.QuestionNum!=FS.QuestionNum) AND (F.CatId='" + DropDownList1.SelectedValue + "' 
And F.SubCatId='" + DropDownList3.SelectedValue + "'))  
ORDER BY F.QuestionNum DESC

QuestionNum我的代码正在检索正确的信息,但如果表中存在多行相同的信息Question_Papers,它会重复显示所有行。我想分别显示在 Question_Papers 表中存在和不存在的唯一行。

请帮助我。

4

3 回答 3

3

对于第二种情况,您可以尝试以下操作:

SELECT F.QuestionNum,F.Question,F.Answer 
FROM QuestionInsert F 
WHERE (F.CatId='" + DropDownList1.SelectedValue + "' And F.SubCatId='" + DropDownList3.SelectedValue + "')
AND F.QuestionNum NOT IN (SELECT QuestionNum FROM Question_Papers)
ORDER BY F.QuestionNum DESC

这是第一个条件:

SELECT F.QuestionNum,F.Question,F.Answer 
FROM QuestionInsert F  
WHERE (F.CatId='" + DropDownList1.SelectedValue + "' 
AND F.SubCatId='" + DropDownList3.SelectedValue + "') 
AND F.QuestionNum IN (SELECT QuestionNum FROM Question_Papers)
ORDER BY F.QuestionNum DESC";

但是,您的代码存在严重问题 - 您是否研究过SQL 注入?有许多数据访问框架,例如Entity Framework,可以让您走上更好的道路。

于 2013-11-12T09:36:19.710 回答
0

您的第一个查询可以使用重写EXISTS

SELECT F.QuestionNum,F.Question,F.Answer FROM QuestionInsert F 
WHERE EXISTS (SELECT * FROM Question_Papers P WHERE P.QuestionNum = F.QuestionNum)
AND F.CatId='" + DropDownList1.SelectedValue + "' 
AND F.SubCatId='" + DropDownList3.SelectedValue + "'

第二个查询使用NOT EXISTS

SELECT F.QuestionNum,F.Question,F.Answer FROM QuestionInsert F 
WHERE NOT EXISTS (SELECT * FROM Question_Papers P WHERE P.QuestionNum = F.QuestionNum)
AND F.CatId='" + DropDownList1.SelectedValue + "' 
AND F.SubCatId='" + DropDownList3.SelectedValue + "'

请注意,使用这些查询的编写方式(取自您的问题),您很容易受到 SQL 注入的攻击。您应该改用参数。

于 2013-11-12T09:35:27.707 回答
0

似乎不需要使用 ajoin也没有理由在where. 形成我可以收集的所有你需要做的就是检查是否存在,最新版本(2005+)的 sql server 支持EXISTS. 将其作为单个查询执行,而不是相关子查询可用于检查和标记存在

DECLARE @question_insert TABLE ( id INT, question VARCHAR(50), answer VARCHAR(50), catid INT, subcatid INT )
DECLARE @question_paper TABLE ( id INT, question_insert_id INT )

INSERT INTO @question_insert ( id, question, answer, catid, subcatid )
VALUES 
    (1, 'How old are you?', '20', 1, 1),
    (2, 'Who was the first president?', '?', 2, 1)

INSERT INTO @question_paper ( id, question_insert_id )
VALUES (1, 1),(2, 1)

SELECT
    qi.id,
    qi.question,
    qi.answer,
    CASE WHEN EXISTS(SELECT 1 FROM @question_paper qp 
                     WHERE qp.question_insert_id = qi.id) 
         THEN 'Yes' ELSE 'No' END AS in_question_paper
FROM @question_insert qi
--WHERE qi.catid=@catid AND qi.subcatid=@subcatid

演示

或者作为单独的查询

SELECT
    qi.id,
    qi.question,
    qi.answer,
    'Yes' AS in_question_paper
FROM @question_insert qi
WHERE EXISTS(SELECT 1 FROM @question_paper qp 
             WHERE qp.question_insert_id = qi.id)

SELECT
    qi.id,
    qi.question,
    qi.answer,
    'No' AS in_question_paper
FROM @question_insert qi
WHERE NOT EXISTS(SELECT 1 FROM @question_paper qp 
                 WHERE qp.question_insert_id = qi.id)

我将重申,您应该阅读SQL 注入,而不是将用户输入连接到查询中。

也重新。DISTINCT不是“可接受的连接”,事实并非如此。不可接受的是DISTINCT在查询的另一部分使用和引用不属于选择列表的列(在这种情况下,它将是WHERE子句),这是一种GROUP BY替代方法。

于 2013-11-12T10:05:55.770 回答