Left Outer Join不返回主表中的所有记录

时间:2011-03-08 17:30:21

标签: mysql join outer-join

当我执行左外连接时,我希望获得查询在添加连接表之前返回的所有记录,但它只返回与连接表匹配的记录(即:'092387'没有记录表'文档'中存在,所以我只想为该记录的'filename'字段返回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)

2 个答案:

答案 0 :(得分:15)

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

outer join保留的非匹配行对NULL都有documentation.status个值,因此您的documentation.status != 3条件会将这些值过滤掉(表达式的结果{ {1}} NULL !=3不是unknown)。

要避免此问题,请使用

true

请注意,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条件。

答案 1 :(得分:0)

检查你的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'

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

您应该遵循Martin的建议并运行他的代码以获得预期的结果。