这是我的两张桌子:
Questions
:QuestionID,Question,SubjectID,Totalmarks,IsActive RoundDetails
:CandidateID,QuestionID,MarksObtain 如何编写查询以从Questions
表中获取所有问题详细信息的结果,结果还应显示候选人是否尝试该问题?
这是我的查询,但我只得到候选人尝试的问题,但我想要尝试和未尝试:
select
q.QuestionID, q.TotalMarks, q.Question,
isnull(rd.MarksObtained, 0) MarksObtained,
convert(bit, isnull(rd.QuestionID, 0)) Attended
from
Questions q
full join
RoundDetails rd on q.questionID = isnull(rd.QuestionID, q.questionID)
where
q.SubjectID = 2 AND q.IsActive = 1 AND rd.CandidateID = 9
答案 0 :(得分:1)
您的查询存在的问题是
AND rd.CandidateID = 9
有效地WHERE
条款"杀死"通过要求RoundDetails
出现来完全加入。
将条件的这一部分移动到连接的ON
子句中,并将连接替换为LEFT OUTER
,因为您无论如何都不需要完整的外部连接:
select
q.QuestionID
, q.TotalMarks
, q.Question
, isnull(rd.MarksObtained, 0) MarksObtained
, convert(bit, isnull(rd.QuestionID, 0)) Attended
from Questions q
left outer join RoundDetails rd
ON q.questionID = q.questionID AND rd.CandidateID = 9
where
q.SubjectID = 2 AND q.IsActive = 1
作为一般规则,您应该非常小心地在WHERE
子句中添加外连接表的条件,因为任何非空保留的条件都会将外连接转换为内连接。
答案 1 :(得分:0)
不同的SQL JOIN
INNER JOIN:当BOTH表中至少有一个匹配时返回所有行
LEFT JOIN:返回左表中的所有行,以及右表中匹配的行
RIGHT JOIN:返回右表中的所有行,以及左表中匹配的行
当您使用完全加入时,您只会得到尝试回答的问题。您需要使用左连接。 take a look at the joins tutorials on W3Schools