Ami*_*har 0 plsql left-join where
以下是我的查询
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
Run Code Online (Sandbox Code Playgroud)
现在,此查询返回给我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
Run Code Online (Sandbox Code Playgroud)
根据我对Left join的理解,左表中的所有行都应保留,即使它们与右表不匹配也是如此。但是,在这种情况下,我的行从query2中的2203减少到query1中的301。那怎么可能?
请在这里提出可能出问题的地方。为了进一步澄清,
具有上述相同“ where”条件的表1具有1300行
具有上述相同“ where”条件的表2具有2203行
具有上面相同“ where”条件的表3有129行
当您的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
Run Code Online (Sandbox Code Playgroud)