2013-12-08 50 views
0

更新 - 好吧三個答案都是有道理的,我會嘗試每個,因爲我很好奇,如果有一個表現+/-,但我不知道我我的表格中有足夠的測試數據來確定。正確左三個表加入 - SQL

我想查看錶A並搜索以查看用戶是否存在於表B或表C中,以便找到任何形式的表A,其中至少有一個表不存在於其他兩個表中他們並不需要在既要存在,就不必具有幾乎相同的語句下面

SELECT emp_id 
FROM 
    tableA 
LEFT JOIN 
    TableB 
ON 
    tableA.emp_id = tableB.emp_id 
WHERE 
    TableA.emp_id IS NULL 

SELECT emp_id 
FROM 
    tableA 
LEFT JOIN 
    TableC 
ON 
    tableA.emp_id = tableC.emp_id 
WHERE 
    TableA.emp_id IS NULL 



Table A 
+---------+--------+-----------+ 
| Emp_ID | Status | hire_date | 
+---------+--------+-----------+ 
| 12345 | happy | 10/10/2005| 
| 54321 | sad | 12/01/2009| 
+---------+--------+-----------+ 

Table B 
+---------+--------+ 
| Emp_ID | Weight | 
+---------+--------+ 
| 12345 | 185 | 
| 54321 | 150 | 
+---------+--------+ 

Table C 
+---------+--------+ 
| Emp_ID | City | 
+---------+--------+ 
| 12345 | Chicago| 
| 54321 | Atlanta| 
+---------+--------+ 

感謝您的任何建議,B或C)

像這樣的事情,但是!

回答

1

爲什麼不直接使用not in表示查詢?

SELECT emp_id 
FROM tableA 
WHERE emp_id not in (select emp_id from TableB) and 
     emp_id not in (select emp_id from TableC); 
2

您可以在單個查詢中加入所有表格。

SELECT a.Emp_ID     -- a.* <<== if you want to include all columns 
FROM tbA a 
     LEFT JOIN tbB b 
      ON a.Emp_ID = b.Emp_ID 
     LEFT JOIN tbC c 
      ON a.Emp_ID = c.Emp_ID 
WHERE b.Emp_ID IS NULL 
     AND c.Emp_ID IS NULL    -- <<== AND should be use here 
1

你可以加入3表只如下

Select emp_id from table1 a left join table2 b on a.emp_id=b.emp_id 
    left join table3 c on c.emp_id=a.emp_id 
1

您的查詢無法工作,因爲你有一個WHERE tableA.emp_id IS NULL,並且表A是你想測試中的emp_id,您應該已針對第二個查詢使用TableB.eemp_id IS NULLTableC.emp_id IS NULL進行了測試。

既然你想不存在至少tableB的或表C行,你可以做一個LEFT JOIN既tableB的並表C和測試,如果這些表中的emp_id的至少一個IS NULL與OR

SELECT emp_id 
FROM tableA 
LEFT JOIN TableB ON tableA.emp_id = tableB.emp_id 
LEFT JOIN TableC ON tableA.emp_id = tableC.emp_id 
WHERE 
    TableB.emp_id IS NULL 
OR TableC.emp_id IS NULL 
+0

同意,當我將我的WHERE複製到論壇時,我犯了一個錯誤,它應該是tableB.emp_id,但是當我使用OR而不是像上面顯示的AND時,我得到一堆結果,我認爲它正在向A中的每個人展示誰不在B中,然後每個人都不在C中。當我使用AND時,它是有效的。我很困惑,因爲我得到了一次emp_id顯示兩次,但我意識到我有一個重複,需要選擇DISTINCT,它的工作。謝謝。 – Jeremy

+0

使用或者你有行不在B或不在C和右,這可能會給你更多的結果。 – ARA