左联接返回的行比预期的少?请提供您的理由,

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行

tri*_*cot 5

当您的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)