2013-02-06 90 views
1

是否可以將以下SQL語句寫成FULL JOIN而不是使用NOT IN?SQL寫入NOT IN FULL JOIN

select * from [user] u 
    AND u.user_id NOT IN (SELECT user_id FROM job) 

我想要做這樣的事情:

SELECT u.* FROM [user] u 
FULL JOIN job uj ON u.user_id = uj.user_id 
WHERE uj.user_id IS NULL 

我希望得到所有沒有使用FULL JOIN在工作表中的記錄用戶。

+2

不使用FULL連接,但左[OUTER] JOIN可以使用您指定的過濾條件。 –

回答

3

你不需要FULL OUTER JOIN。你需要一個LEFT JOIN

select * 
from [user] u 
left join job uj 
    on u.user_id = uj.user_id 
where uj.user_id IS NULL 

一個LEFT JOIN將返回從user所有行而不管是否有在job表中的匹配行。

然後,當您添加where j.user_id is null過濾器時,它將只返回user表中的所有記錄。

這是一個很棒的visual explanation of joins,當試圖找出正確的連接語法時,它會派上用場。

查看SQL Fiddle Demo查詢的兩個版本(NOT INLEFT JOIN),這表明它們都返回相同的數據。

2
SELECT u.* 
FROM [user] u 
LEFT JOIN job j on (u.user_id = j.user_id) 
WHERE j.user_id is NULL 

爲什麼你需要使用FULL JOIN?以上給出了你正在尋找的東西。

2

你想要一個left outer join。 A full outer join有點多餘,因爲大概uj.user_id不會是NULL。

這兩個查詢是等價的,雖然它們可能有不同的執行計劃,具體取決於數據庫。