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 |
+-------+-------------+

次の方法で、dept を持たない tbl_emp からのすべての従業員名と、従業員を持たない tbl_dept からのすべての dname をリストしたいと思います。

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 に答える