左连接 returns 行比预期少?
Left join returns fewer rows than expected?
以下是我的查询:
Select Count(*)
from Table1 s
left join Table2 d
ON s.subjectid = d.subjectid
and s.PROJECTID = d.projectid
and s.SITEName = d.SITENAME
left join Table3 dev
on s.subjectid = dev.subjectid
and s.projectid = dev.projectid
and s.siteid = dev.siteid
Where s.isprod =1
and d.isprod =1
and dev.isprod = 1
and s.projectid =107
-- Output 301 ROWS
此查询returns 301 行。但是,如果我不使用 Table3
则连接 returns 2203 行,如下面的查询所示:
Select Count(*)
from Table1 s
left join Table2 d
ON s.subjectid = d.subjectid
and s.PROJECTID = d.projectid
and s.SITEName = d.SITENAME
Where s.isprod =1
and d.isprod =1
and s.projectid =107
-- OutPut 2203 ROWS
根据我对 left join
的理解,左边 table 的所有行应该保留,即使它们与右边 table 不匹配。但是在这种情况下,行数从查询 2 中的 2203 减少 到查询 1 中的 301。这怎么可能?
请指出这里可能出了什么问题。如需更多说明:
Table1
与上面相同的 where
条件有 1300 行
Table2
与上面相同的 where
条件有 2203 行
Table3
与上面相同的 where
条件有 129 行
第一个 SQL 有 "where" 子句 "and dev.isprod = 1"。这很可能减少了返回的行数。
当您的 where
子句中有条件对来自 table 的记录施加非空约束时,您已经进行了外部连接,您实际上破坏了外部连接的效果,并使它充当内部连接
解决方案是将此类约束移动到外连接的 on
子句中:
Select Count(*)
from Table1 s
left join Table2 d
ON s.subjectid = d.subjectid
and s.PROJECTID = d.projectid
and s.SITEName = d.SITENAME
and d.isprod =1
left join Table3 dev
on s.subjectid = dev.subjectid
and s.projectid = dev.projectid
and s.siteid = dev.siteid
and dev.isprod = 1
Where s.isprod =1
and s.projectid =107
以下是我的查询:
Select Count(*)
from Table1 s
left join Table2 d
ON s.subjectid = d.subjectid
and s.PROJECTID = d.projectid
and s.SITEName = d.SITENAME
left join Table3 dev
on s.subjectid = dev.subjectid
and s.projectid = dev.projectid
and s.siteid = dev.siteid
Where s.isprod =1
and d.isprod =1
and dev.isprod = 1
and s.projectid =107
-- Output 301 ROWS
此查询returns 301 行。但是,如果我不使用 Table3
则连接 returns 2203 行,如下面的查询所示:
Select Count(*)
from Table1 s
left join Table2 d
ON s.subjectid = d.subjectid
and s.PROJECTID = d.projectid
and s.SITEName = d.SITENAME
Where s.isprod =1
and d.isprod =1
and s.projectid =107
-- OutPut 2203 ROWS
根据我对 left join
的理解,左边 table 的所有行应该保留,即使它们与右边 table 不匹配。但是在这种情况下,行数从查询 2 中的 2203 减少 到查询 1 中的 301。这怎么可能?
请指出这里可能出了什么问题。如需更多说明:
Table1
与上面相同的where
条件有 1300 行Table2
与上面相同的where
条件有 2203 行Table3
与上面相同的where
条件有 129 行
第一个 SQL 有 "where" 子句 "and dev.isprod = 1"。这很可能减少了返回的行数。
当您的 where
子句中有条件对来自 table 的记录施加非空约束时,您已经进行了外部连接,您实际上破坏了外部连接的效果,并使它充当内部连接
解决方案是将此类约束移动到外连接的 on
子句中:
Select Count(*)
from Table1 s
left join Table2 d
ON s.subjectid = d.subjectid
and s.PROJECTID = d.projectid
and s.SITEName = d.SITENAME
and d.isprod =1
left join Table3 dev
on s.subjectid = dev.subjectid
and s.projectid = dev.projectid
and s.siteid = dev.siteid
and dev.isprod = 1
Where s.isprod =1
and s.projectid =107