此子查询是否可以写为连接并仍然获得相同的结果集/行数?

时间:2017-08-09 22:43:24

标签: sql sql-server join subquery

如何将以下内容编写为连接并获得相同数量的行?

SELECT
  s.subjectid,
  s.subjectname,
  (SELECT
    COUNT(*)
  FROM dbo.Classes AS c
  WHERE c.SubjectID = s.SubjectID
  AND c.MondaySchedule = 1)
  AS numofclasses
FROM dbo.subjects AS s
ORDER BY numofclasses DESC

我试着像下面这样写,但得到一个不同的答案:

SELECT
  s.subjectid,
  COUNT(ClassID) AS numberofclasses
FROM dbo.subjects AS s
LEFT JOIN dbo.classes AS c
  ON s.SubjectID = c.SubjectID
WHERE c.MondaySchedule = 1
GROUP BY s.Subjectid
ORDER BY numberofclasses DESC

1 个答案:

答案 0 :(得分:1)

where条件移至on条件。它将外连接转换为内连接:

select s.subjectid, count(ClassID) as numberofclasses
from dbo.subjects s left join
     dbo.classes c
     on s.SubjectID = c.SubjectID and c.MondaySchedule = 1 
group by s.Subjectid
order by numberofclasses desc ;

这确实假设subjects(subjectid)是唯一的(或主键)。如果没有,两者可能会返回不同的结果。