【问题标题】:Join tables with null values in FK在 FK 中连接具有空值的表
【发布时间】:2013-06-07 06:52:06
【问题描述】:

我想从三个表中选择一些值,这些表是通过外键关联的。

包含外键的表在该 FK 中可能有一个空值。

当我从三个表中选择时,我没有得到 FK 为空的行。

例如,这些是我的表格:

表 1(boninterne):

+---------+-----------+----------+----------+
|   num   |   date    | codePers | codeDept |
+---------+-----------+----------+----------+
|1        |12/10/2012 +  NULL    |  2       |
+---------+-----------+----------+----------+
|2        |12/10/2012 |  NULL    |  NULL    |
+---------+-----------+----------+----------+
|3        |12/10/2012 |  1       |  2       |
+---------+-----------+----------+----------+
|4        |12/10/2012 |  4       |  NULL    |
+---------+-----------+----------+----------+
|5        |12/10/2012 |  12      |  2       |
+---------+-----------+----------+----------+
|6        |12/10/2012 |  3       |  NULL    |
+---------+-----------+----------+----------+
|7        |12/10/2012 |  1       |  2       |
+---------+-----------+----------+----------+
|8        |12/10/2012 |  NULL    |  3       |
+---------+-----------+----------+----------+

表 2(人员):

+---------+-----------+----------+
|codePers |prenomPers | nomPers  |
+---------+-----------+----------+
|1        |AA         +  ZZ      |
+---------+-----------+----------+
|4        |BB         |  WW      |
+---------+-----------+----------+
|3        |CC         |  XX      |
+---------+-----------+----------+
|12       |DD         |  VV      |
+---------+-----------+----------+

表 3(部门):

+---------+-----------+
|codeDept |libDept    |
+---------+-----------+
|2        |DEPT A1    +
+---------+-----------+
|3        |DEPT B1    |
+---------+-----------+

这是我的查询:

SELECT num, date, CONCAT(prenomPers,' ',nomPers) AS nom, libDept 
FROM boninterne, personnel, departement
WHERE boninterne.codePers = personnel.codePers
AND boninterne.codeDept = departement.codeDept

我要获取的表格是:

+---------+-----------+----------+----------+
|   num   |   date    | nom      | libDept  |
+---------+-----------+----------+----------+
|1        |12/10/2012 +  NULL    |  DEPT A1 |
+---------+-----------+----------+----------+
|2        |12/10/2012 |  NULL    |  NULL    |
+---------+-----------+----------+----------+
|3        |12/10/2012 |  AA ZZ   |  DEPT A1 |
+---------+-----------+----------+----------+
|4        |12/10/2012 |  BB WW   |  NULL    |
+---------+-----------+----------+----------+
|5        |12/10/2012 |  DD VV   |  DEPT A1 |
+---------+-----------+----------+----------+
|6        |12/10/2012 |  CC XX   |  NULL    |
+---------+-----------+----------+----------+
|7        |12/10/2012 |  AA ZZ   |  DEPT A1 |
+---------+-----------+----------+----------+
|8        |12/10/2012 |  NULL    |  DEPT B1 |
+---------+-----------+----------+----------+

但我真正得到的是:

+---------+-----------+----------+----------+
|   num   |   date    | nom      | libDept  |
+---------+-----------+----------+----------+
|3        |12/10/2012 |  AA ZZ   |  DEPT A1 |
+---------+-----------+----------+----------+
|5        |12/10/2012 |  DD VV   |  DEPT A1 |
+---------+-----------+----------+----------+
|7        |12/10/2012 |  AA ZZ   |  DEPT A1 |
+---------+-----------+----------+----------+

我必须在查询中进行哪些更改才能获得该表??

【问题讨论】:

  • 请使用 ANSI 1992 连接。之后你会更清楚。
  • @Sebas ANSI 1992 连接是什么意思?
  • 参见andrew.cmu.edu/user/shadow/sql/sql1992.txt,查找“查询表达式”第 179 页(向前)
  • 他的意思是明确的JOIN ... ON语法。

标签: mysql join


【解决方案1】:

您的结果是正确的,因为您使用的是内部联接。您可以通过使用正确的连接语法并改用 left outer join 来解决此问题:

SELECT num, date, CONCAT(prenomPers,' ',nomPers) AS nom, libDept 
FROM boninterne
left outer join personnel
    on boninterne.codePers = personnel.codePers
left outer join departement
     on boninterne.codeDept = departement.codeDept;

这会将所有内容保留在第一个表中,即使没有匹配项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多