plsql - 左连接返回的行数少于预期?

标签 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
               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。这怎么可能?
请建议这里可能出了什么问题。如需更多说明:
  • Table1where上述条件有 1300 行
  • Table2where上述条件有 2203 行
  • Table3where上述条件有 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
    

    关于plsql - 左连接返回的行数少于预期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44143493/

    相关文章:

    mysql - 当在查询中给出没有任何条件的字段名称时会发生什么?

    ios - SQL WHERE IN 子句不起作用 - FMDB - 传递逗号分隔的字符串

    java - 如何在调用 Java Web 服务之前检查它是否已启动并在 PL/SQL 中运行

    oracle - 从 PL/SQL 返回错误

    mysql - 按连接表的多行排序连接查询

    mysql - 为什么 Left outer Join 没有正确使用索引

    oracle - PL/SQL 如何从数据中删除字符

    oracle - 作为 18C 升级的一部分,OWA_UTIL.who_ Called_me 中进行了哪些更改?

    sql - 两个左连接与联合的性能

    linq - LINQ to SQL 中的多个延迟 WHERE 子句表达式