2013-02-06 50 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。

这两个查询是等价的,虽然它们可能有不同的执行计划,具体取决于数据库。