2013-02-17 18 views
0

行查找以下測試表:MySQL5的查詢幫助找到非驗證加入

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

我想列出從tbl_emp所有員工的姓名不具有部門和所有的DNAME從具有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。

+0

請注意,你可以用全外做到這一點加入,但MySQL不支持全外連接。 – 2013-02-17 15:01:58

回答

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