如何在sql中获取两个表的结果?

时间:2015-04-08 13:43:25

标签: sql

这是我的两张桌子:

  • 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 

2 个答案:

答案 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:返回右表中的所有行,以及左表中匹配的行

FULL JOIN:当其中一个表

匹配时返回所有行

当您使用完全加入时,您只会得到尝试回答的问题。您需要使用左连接take a look at the joins tutorials on W3Schools