以下是我的查询
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
现在这个查询返回给我301行,但是如果我不使用Table3那么连接会返回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
根据我对左连接的理解,左表中的所有行都应该保留,即使它们与右表不匹配。但是在这种情况下,我的行从query2中的2203减少到query1中的301。怎么可能?
请在此处提出可能出现的问题。有关更多说明,
表1具有与上述相同的“where”条件具有1300行
表2具有与上述相同的“where”条件具有2203行
表3具有与上述相同的“where”条件具有129行
答案 0 :(得分:4)
当你的where
子句中有条件对来自外连接的表的记录放置非空约束时,你有效地破坏外连接的效果,并使其充当内连接
解决方案是将这些约束移动到外连接的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
答案 1 :(得分:0)
第一个SQL还有“其中”子句“和dev.isprod = 1”。这很可能是减少返回的行数。