SQL连接与子查询vs存在匹配和过滤行

时间:2016-03-18 00:02:01

标签: sql-server

我的表格包含以下字段:Id, Name, Dept

示例数据:

ID    Name    Dept 
1     John      A   
2     Mary      A   
3     Tom       A   
4     David     A   
5     Mary      B   
6     David     B 

我正在尝试获取部门'A'但不在部门'B'

中的名称

我能够提出一个可以得到预期结果的查询:

select Id, Name, Dept
from test
Where  Dept= 'a' and name not in (
  select name from test where Dept= 'b')

但是我怎么能用连接做同样的事呢?

2 个答案:

答案 0 :(得分:4)

您可以使用LEFT JOIN

SELECT t1.*
FROM test t1
LEFT JOIN test t2
    ON t1.Name = t2.Name
    AND t2.Dept = 'B'
WHERE
    t1.Dept = 'A'
    AND t2.ID IS NULL

但我更喜欢NOT EXISTS方法:

SELECT *
FROM test t
WHERE
    t.Dept = 'A'
    AND NOT EXISTS(SELECT 1 FROM test WHERE Name = t.Name AND Dept = 'B')

Aaron Bertrand撰写了一篇文章,比较了检查行是否存在的不同技术,NOT EXISTS通常是最佳选择。

答案 1 :(得分:1)

怎么样:

SELECT A.Id, A.Name, A.Dept
FROM test A, test B
WHERE A.Dept= 'a' 
AND B.Dept = 'b'
AND A.Name <> B.Name