左连接 returns 行比预期少?

Left join returns fewer rows than expected?

以下是我的查询:

  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

此查询returns 301 行。但是,如果我不使用 Table3 则连接 returns 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 的理解,左边 table 的所有行应该保留,即使它们与右边 table 不匹配。但是在这种情况下,行数从查询 2 中的 2203 减少 到查询 1 中的 301。这怎么可能?

请指出这里可能出了什么问题。如需更多说明:

第一个 SQL 有 "where" 子句 "and dev.isprod = 1"。这很可能减少了返回的行数。

当您的 where 子句中有条件对来自 table 的记录施加非空约束时,您已经进行了外部连接,您实际上破坏了外部连接的效果,并使它充当内部连接

解决方案是将此类约束移动到外连接的 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