sql - LEFT JOIN 根据 WHERE 条件的位置给出不同的数据集

标签 sql sql-server sql-server-2008 tsql sql-server-2012

请参阅以下 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.skSchoolNULL - 匹配行。在左连接中的第二表上放置条件的正确方法是使用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/

相关文章:

sql - 如何每天自动运行一个存储过程

php - 如何解决这个模棱两可的问题?

sql - 使用 `newid()` 将单行子查询与列交叉连接会导致每一行都有不同的 GUID

直接从控制台sql查询结果到csv文件

sql - CROSS APPLY vs OUTER APPLY速度差

sql-server - SQL Server : Data Page size confusion: 8060 + 96 byte is still less than 8k byte

sql-server - 备份权限

Mysql - 复杂的查询给我带来了问题

sql-server - SQL Server 非聚集索引

sql - SSRS - 将静态 null 添加到参数查询