请参阅以下 3 个要点,只是为了让您对表格数据有一个简单的了解。全部skCitizen
在[dbo].[LUEducation]
存在于 [dbo].[LUCitizen]
SELECT COUNT(*) FROM [dbo].[LUCitizen] --115000 ROWS
SELECT COUNT(*) FROM [dbo].[LUEducation] --201846 ROWS
SELECT COUNT(*) --212695 ROWS
FROM [dbo].[LUCitizen] C
LEFT JOIN [dbo].[LUEducation] E
ON C.skCitizen = E.skCitizen
SELECT COUNT(*) FROM [dbo].[LUEducation] WHERE skSchool = 24417 --4 ROWS
<小时/>
请参阅以下 2 个查询,
SELECT C.skCitizen,E.skCitizen
FROM [dbo].[LUCitizen] C
LEFT JOIN [dbo].[LUEducation] E
ON C.skCitizen = E.skCitizen
WHERE E.skSchool = 24417
--4 ROWS
SELECT C.skCitizen,E.skCitizen
FROM [dbo].[LUCitizen] C
LEFT JOIN (SELECT * FROM [dbo].[LUEducation] WHERE skSchool = 24417) E
ON C.skCitizen = E.skCitizen
--115000 ROWS
在最后两个查询中,令我困惑的查询是第一个。我预计115000 rows
,但只有4 rows
显示。
据我了解,完整行来自 [dbo].[LUCitizen]
将显示,然后从 [dbo].[LUEducation]
开始 4 行将是LEFT
已加入。
为什么两个查询不同?
如果这是一个重复的问题,请原谅。
最佳答案
当你这样做时:
SELECT C.skCitizen,E.skCitizen
FROM [dbo].[LUCitizen] C
LEFT JOIN [dbo].[LUEducation] E
ON C.skCitizen = E.skCitizen
WHERE E.skSchool = 24417;
您正在将左连接
转换为内连接
,因为对于非连接,E.skSchool
为NULL
- 匹配行。在左连接
中的第二表上放置条件的正确方法是使用on
子句:
SELECT C.skCitizen,E.skCitizen
FROM [dbo].[LUCitizen] C
LEFT JOIN [dbo].[LUEducation] E
ON C.skCitizen = E.skCitizen AND E.skSchool = 24417;
关于sql - LEFT JOIN 根据 WHERE 条件的位置给出不同的数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25485624/