比较2个表并找到丢失的记录

时间:2014-01-05 15:00:44

标签: sql sql-server-2008 tsql

我有2个数据库表:

customerscustomers_1

我在customers表中有100个客户,但customers_1表中只有99个客户。我想编写一个查询来比较2个表,并将导致缺少的行。

我在SQL下面尝试了这个:

select * from customers c where in (select * from customers_1)

但这只会检查一张桌子。

3 个答案:

答案 0 :(得分:3)

您的查询不应该以这种方式工作。您必须将一列与另一列进行比较,并使用NOT IN代替IN

select * 
from customers c 
where customerid not in (select customerid from customers_1)

但是,由于您使用的是SQL Server 2008,因此可以使用EXCEPT

SELECT * FROM customers
EXCEPT 
SELECT * FROM customers_1;

这将为您提供customers表中不在customers_1表中的行:

  

EXCEPT返回左查询中没有的任何不同值   也在正确的查询中找到。

答案 1 :(得分:2)

这很容易。只需使用左外连接将它们连接起来,并检查表中包含99行的NULL。它看起来像这样。

SELECT * FROM customers c
LEFT JOIN customers1 c1 ON c.some_key = c1.some_key
WHERE c1.some_key IS NULL 

答案 2 :(得分:1)

而不是NOT IN子句考虑使用NOT EXISTS。 NOT EXISTS子句在此特定方案中表现更好。您的查询将如下所示:

SELECT * FROM Customer c WHERE NOT EXISTS (SELECT 1 FROM Customer_1 c1 WHERE c.Customer_Id = c1.Customer_Id)

SELECT 1仅用于提高可读性,因此每个人都知道我不关心实际数据。