Plsql 左联接返回的行数是否比预期的少?
以下是我的疑问:Plsql 左联接返回的行数是否比预期的少?,plsql,left-join,where-clause,Plsql,Left Join,Where Clause,以下是我的疑问: Select Count(*) from Table1 s left join Table2 d ON s.subjectid = d.subjectid and s.PROJECTID = d.projectid and s.SITEName = d.SITENAME lef
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
根据我对left join
的理解,左表中的所有行都应该保留,即使它们与右表不匹配。但是在这种情况下,行数从查询2中的2203减少到查询1中的301。这怎么可能
请指出这里可能出现的问题。如需进一步澄清:
具有相同的表1
条件如上所述有1300行条件,其中
具有相同的表2
条件与上述条件相同,共有2203行条件,其中
具有相同的表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
这是一个非常精确的解决方案!!谢谢你,特林科特!!谢谢你,先生,非常感谢你清楚的回答,消除了我的困惑。