左连接返回的行数少于预期?请提供你的推理,

时间:2017-05-23 19:29:00

标签: 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

现在这个查询返回给我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

根据我对左连接的理解,左表中的所有行都应该保留,即使它们与右表不匹配。但是在这种情况下,我的行从query2中的2203减少到query1中的301。怎么可能?

请在此处提出可能出现的问题。有关更多说明,

表1具有与上述相同的“where”条件具有1300行

表2具有与上述相同的“where”条件具有2203行

表3具有与上述相同的“where”条件具有129行

2 个答案:

答案 0 :(得分:4)

当你的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

答案 1 :(得分:0)

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