2011-04-15 67 views
29

有人请提供如何使用连接编写以下sql查询。我不想使用不在以及如果可能我想代替其中条件以及。如何使用连接编写“不在()”sql查询

SELECT d1.Short_Code 
FROM domain1 d1 
WHERE d1.Short_Code NOT IN (
    SELECT d2.Short_Code 
    FROM Domain2 d2 
) 

我使用SQL Server 2008

回答

45

文章:

可能是,如果您感兴趣的。

在一对夫妇的话,这个查询:

SELECT d1.short_code 
FROM domain1 d1 
LEFT JOIN 
     domain2 d2 
ON  d2.short_code = d1.short_code 
WHERE d2.short_code IS NULL 

将工作,但它比NOT NULL(或NOT EXISTS)构建效率较低。

您也可以使用此:

SELECT short_code 
FROM domain1 
EXCEPT 
SELECT short_code 
FROM domain2 

这既不使用也不NOT INWHERE(甚至没有加入!),但是这将删除domain1.short_code如果有所有重复。

+1

@Quassnoi,请您提供有效的方式书写方式使用或者“NOT NULL”和/或“NOT EXISTS” – Elangesh 2011-04-15 12:36:10

+1

@Elan相同的查询:您原来的查询是刚刚好。只需在两个表中的'short_code'上创建索引。 – Quassnoi 2011-04-15 12:38:52

+0

@Quassnoi - 你假设他不需要任何来自domain2表的信息 – Aducci 2011-04-15 12:50:31

10
SELECT d1.Short_Code 
FROM domain1 d1 
LEFT JOIN domain2 d2 
ON d1.Short_Code = d2.Short_Code 
WHERE d2.Short_Code IS NULL 
1

在这种情况下,我会选择NOT EXISTS

SELECT D1.ShortCode 
FROM Domain1 D1 
WHERE NOT EXISTS 
    (SELECT 'X' 
    FROM Domain2 D2 
    WHERE D2.ShortCode = D1.ShortCode 
    ) 
+0

'不存在'会产生什么区别? – Quassnoi 2011-04-15 12:56:13

+0

优化程序应该使用两个表之间的排除合并连接的等效替代外连接或复杂OR操作(使用NOT IN子句)。 – 2011-04-15 12:59:27

+2

优化器将为'NOT IN'和'NOT EXISTS'构建完全相同的计划(只要'short_code'不可空)。不会有“复杂的OR操作”。 – Quassnoi 2011-04-15 13:14:03