我有2个数据库表:
customers
和customers_1
我在customers
表中有100个客户,但customers_1
表中只有99个客户。我想编写一个查询来比较2个表,并将导致缺少的行。
我在SQL下面尝试了这个:
select * from customers c where in (select * from customers_1)
但这只会检查一张桌子。
答案 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仅用于提高可读性,因此每个人都知道我不关心实际数据。