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行


第一个SQL有额外的“where”子句和dev.isprod=1“。这很可能是减少了返回的行数。

如果在
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

这是一个非常精确的解决方案!!谢谢你,特林科特!!谢谢你,先生,非常感谢你清楚的回答,消除了我的困惑。