如何在mysql left join中存在join之后仍带null值

u0sqgete  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(427)

我在mysql数据库中有两个表,分别是department\u master和division\u 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
pieyvz9o

pieyvz9o1#

您只需添加 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 ,自从 UNION 将为匹配行和非匹配行添加空行。

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

相关问题