0

在测试表下方找到:

SELECT * FROM tbl_emp; // There must be few employee with no dept id (did)
+------+-------+------+
| eid  | ename | did  |
+------+-------+------+
|    1 | SCOTT |    2 |
|    2 | JAMES |    4 |
|    3 | BOND  |    1 |
|    4 | TIGER |    5 |
|    5 | CHIP  |    0 |
|    6 | DALE  |    0 |
|    7 | MARY  |    0 |
+------+-------+------+

SELECT * FROM tbl_dept;// There must be few depts which have no employee.
+-------+-------------+
| dptid | dname       |
+-------+-------------+
|     1 | HR          |
|     2 | IT          |
|     3 | ADMIN       |
|     4 | TRAVEL      |
|     5 | SALES       |
|     6 | FINANCE     |
|     7 | ENGINEERING |
+-------+-------------+

我想以以下方式在 SINGLE QUERY 中列出 tbl_emp 中没有部门的所有员工姓名和 tbl_dept 中没有员工的所有员工姓名:

DESIRED RESULTSET:
-------------------
ename  dname
CHIP    
DALE
MARY
       ADMIN
       FINANCE
       ENGINEERING
-------------------

我能做的就是:

SELECT ename FROM tbl_emp WHERE did NOT IN (SELECT dptid FROM tbl_dept);

SELECT dname FROM tbl_dept WHERE dptid NOT IN (SELECT did FROM tbl_emp);

请帮助选择 dname 和 ename 以及在单个查询中也是如此。

4

1 回答 1

0

您可以使用UNION

SELECT ename, NULL dname 
FROM tbl_emp 
WHERE did NOT IN (SELECT dptid FROM tbl_dept)
UNION
SELECT NULL ename, dname 
FROM tbl_dept 
WHERE dptid NOT IN (SELECT did FROM tbl_emp);

更新 1

您也可以使用LEFT JOIN而不是使用NOT IN我宁愿使用这个

SELECT  a.ename, b.dname 
FROM    tbl_emp a 
        LEFT JOIN tbl_dept b
            ON a.did = b.dptid
WHERE   b.dptid IS NULL
UNION
SELECT  c.ename, d.dname 
FROM    tbl_dept d 
        LEFT JOIN tbl_emp c
            ON d.dptid = c.did
WHERE   c.did IS NULL
于 2013-02-17T14:55:04.290 回答