Py学习  »  DATABASE

在mysql左连接中,即使存在join,也如何带空值

ashish • 5 年前 • 1328 次点击  

我在mysql数据库中有两个表,分别是department_master和division_master。

DEPARTMENT_MASTER              DIVISION_MASTER
DEPT_ID | DEPT_NAME            DIVISION_ID | DIVISION_NAME | DEPT_ID
1       | HR                   1           | DIV1          | 1
2       | CLINICAL             2           | DIV2          | 1
3       | IT                   3           | DIV3          | 2

我将这个简单的SQL查询作为-

SELECT DM.DEPT_NAME, DV.DIVISION_NAME, DM.DEPT_ID, DV.DIVISION_ID 
FROM DEPARTMENT_MASTER DM 
LEFT JOIN DIVISION_MASTER DV ON DM.DEPT_ID = DV.DEPT_ID

所以我得到了这样的结果

DEPT_NAME | DIVISION_NAME | DEPT_ID | DIVISION_ID
HR        | DIV1          | 1       | 1
HR        | DIV2          | 1       | 2
CLINICAL  | DIV3          | 2       | 3
IT        | NULL          | 3       | NULL

有什么办法可以让我得到这样的结果吗-

DEPT_NAME | DIVISION_NAME | DEPT_ID | DIVISION_ID
HR        | NULL          | 1       | NULL
HR        | DIV1          | 1       | 1
HR        | DIV2          | 1       | 2
CLINICAL  | NULL          | 2       | NULL
CLINICAL  | DIV3          | 2       | 3
IT        | NULL          | 3       | NULL
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/38730
 
1328 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Barmar
Reply   •   1 楼
Barmar    6 年前

您可以简单地添加 UNION 返回所需的所有空值的查询。

SELECT * FROM (
    SELECT DM.DEPT_NAME, DV.DIVISION_NAME, DM.DEPT_ID, DV.DIVISION_ID 
    FROM DEPARTMENT_MASTER DM 
    LEFT JOIN DIVISION_MASTER DV ON DM.DEPT_ID = DV.DEPT_ID
    UNION 
    SELECT DEPT_NAME, NULL, DEPT_ID, NULL
    FROM DEPARTMENT_MASTER) AS x
ORDER BY DEPT_NAME, DIVISION_NAME

但在这种情况下,你最好使用 INNER JOIN ,因为 联合 将为匹配行和不匹配行添加空行。

SELECT * FROM (
    SELECT DM.DEPT_NAME, DV.DIVISION_NAME, DM.DEPT_ID, DV.DIVISION_ID 
    FROM DEPARTMENT_MASTER DM 
    INNER JOIN DIVISION_MASTER DV ON DM.DEPT_ID = DV.DEPT_ID
    UNION ALL
    SELECT DEPT_NAME, NULL, DEPT_ID, NULL
    FROM DEPARTMENT_MASTER) AS x
ORDER BY DEPT_NAME, DIVISION_NAME