2015-09-16 27 views
1

到目前爲止,我看到的每個線程都是檢查重複行並避免它們。我試圖讓一個查詢只返回重複的行。我認爲這會像子查詢一樣簡單,但我錯了。然後,我嘗試以下內容:僅返回兩個表中的重複行

SELECT * FROM a 
WHERE EXISTS 
(
    SELECT * FROM b 
    WHERE b.id = a.id 
) 

太過了。如何只返回重複的行?我目前正在經歷兩張桌子,但恐怕有大量的重複。

+0

你是什麼意思重複?兩個表中存在的行還是兩次出現在單個表中的行?如果只有id是相同的,或者所有其他列都必須相同,那麼它是否是重複的? – Gary

回答

0

我相信你貼的代碼將工作太像

SELECT * FROM a 
WHERE EXISTS 
(
    SELECT 1 FROM b WHERE id = a.id 
) 

可以如做一個INNER JOIN

SELECT a.* FROM a 
JOIN b on a.id = b.id; 

您可以如用一個IN運營商說

SELECT * FROM a where id in (select id from b); 

如果沒有它們,那麼你可以使用UNION如果兩個表滿足工會的限制與ROW_NUMBER()功能像

SELECT * FROM (
SELECT *, 
ROW_NUMBER() OVER(PARTITION BY id ORDER BY id) AS rn 
FROM (
select * from a 

union all 

select * from b) xx) yy 
WHERE rn = 1; 
2

使用此查詢,如果您檢查相關列,可能會更好。

SELECT * FROM a 

INTERSECT 

SELECT * FROM b 
1

注意沿:有歧義,以你的意思是重複行什麼,以及你是否'重新談論重複的鍵,或者所有的字段都是相同的。我的回答涉及所有領域是相同的;其他一些人則認爲這只是關鍵。目前還不清楚你打算如何。

你可以嘗試

SELECT id, col1, col2 FROM a INNER JOIN b ON a.id = b.id 
    WHERE a.col1 = b.col1 AND a.col2 = b.col2 

將根據需要等欄目。數據庫引擎應該足夠智能以便首先在索引列上進行比較,因此只要沒有僅在大量非索引字段上不同的行,它就會高效。 (如果你這樣做,那麼我認爲任何事情都不會特別有效。)