左外连接不返回主表中的所有记录

Posted

技术标签:

【中文标题】左外连接不返回主表中的所有记录【英文标题】:Left Outer Join not returning all records from primary table 【发布时间】:2011-07-11 07:13:26 【问题描述】:

当我进行左外连接时,我希望在添加连接表之前获得查询将返回的所有记录,但它只返回与连接表匹配的记录(即:没有记录'092387'存在于表“文档”中,所以我只想为该记录的“文件名”字段返回 null。)我做错了什么?

mysql> select documentation_reference.ref_docnumber
            , documentation.filename 
      from documentation_reference 
      left outer join documentation on ref_docnumber=documentation.docnumber      
      where documentation_reference.docnumber='TP-036' 
      and documentation.status!=3;
+---------------+-----------------+
| ref_docnumber | filename        |
+---------------+-----------------+
| SOP-0042      | SOP-0042r39.pdf |
+---------------+-----------------+
1 row in set (0.00 sec)

mysql> select ref_docnumber 
       from documentation_reference 
       where documentation_reference.docnumber='TP-036';
+----------------------+
| ref_docnumber        |
+----------------------+
| 092387               |
| 1100218B             |
| Applicable Item Spec |
| SOP-0042             |
+----------------------+
4 rows in set (0.00 sec)

【问题讨论】:

【参考方案1】:

您的 where 子句将外部联接转换回内部联接。

outer join 保留的非匹配行都将具有documentation.statusNULL 值,因此您的documentation.status != 3 条件会将这些过滤掉(表达式NULL !=3 的结果是unknown 而不是@ 987654327@).

为避免此问题,请使用

select documentation_reference.ref_docnumber,
       documentation.filename
from   documentation_reference
       left outer join documentation
         on ref_docnumber = documentation.docnumber
            and documentation.status != 3
where  documentation_reference.docnumber = 'TP-036'  

请注意,documentation.status != 3 谓词已移至 JOIN 条件中。

【讨论】:

对……就是这样。感谢您的帮助 - 这是有道理的。【参考方案2】:

检查您的documentation.status!=3 条件...这可能是罪魁祸首...我认为这是消除您预期的记录。

通常要调试此问题,请部分运行您的查询,首先运行 -

select documentation_reference.ref_docnumber, documentation.filename from documentation_reference left outer join documentation on ref_docnumber=documentation.docnumber

检查结果,然后使用 where 运行查询 -

select documentation_reference.ref_docnumber, documentation.filename from documentation_reference left outer join documentation on ref_docnumber=documentation.docnumber
where  documentation_reference.docnumber = 'TP-036'

检查添加最终 where 条件后它们应该更改的结果 - documentation.status!=3

您或许应该听从 Martin 的建议并运行他的代码以获得预期的结果。

【讨论】:

以上是关于左外连接不返回主表中的所有记录的主要内容,如果未能解决你的问题,请参考以下文章

左外连接和右外连接的区别

7-10外连接查询

左外连接没有给出任何结果

左外连接右外连接内连接全连接的概念

左外连接 - 如何在第二个表中返回一个布尔值?

如何将 LINQ 左外连接限制为一行