2014-01-05 166 views
1

我有2個數據庫表:比較2個表和尋找失蹤的記錄

customerscustomers_1

我在customers表100級的客戶,但只有99客戶在customers_1表。我想編寫一個查詢來比較兩個表,並導致缺失的行。

我已經試過這個SQL語句:

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

但是,這將只檢查一個表。

回答

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表:

除非返回從任何不同的值在正確的查詢中也找到不是 的左側查詢。

+0

這很好!謝謝。我會在6分鐘內接受 – PriceCheaperton

+1

@PriceCheaperton - 不客氣:) –

+1

我可以得到upvote:D – PriceCheaperton

2

這很簡單。只需將它們連接到左外連接並在具有99行的表中檢查NULL。它看起來像這樣。

SELECT * FROM customers c 
LEFT JOIN customers1 c1 ON c.some_key = c1.some_key 
WHERE c1.some_key IS NULL 
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只是爲了便於閱讀,所以每個人都會知道我並不關心實際數據。