2012-02-27 52 views
2

你好,我一直在這一整個上午工作。我認爲這是一個簡單的自連接,但自連接實際上返回的行太多。如何從表中選擇不同列中的三個或更多值相同的行?

本質上,我試圖找到表中某些列值匹配行與行的表中的行。

因此,如果第一行和第三行在三個特定列中具有相同的列值,則返回這兩行。

到目前爲止,我嘗試了一種自聯接和一種以兩種不同方式進行的半聯接。

SELECT * 
FROM ATable a, ATable b 
Where a.colValue = b.colValue 
and a.colValue2 = b.colValue2 

這會返回太多的行。 這個查詢甚至是連接嗎?我在這裏錯了嗎? 我錯過了什麼自聯接,它比表本身返回更多的行?

ATable包含20行,但上面的查詢返回36

一如既往非常感謝任何答案或提示。我只是通過制定問題來學習很多東西。

+0

可能要添加'和a.id <> b.id'以消除匹配本身 – cairnz 2012-02-27 17:00:12

回答

2

此時的查詢將返回每一行,因爲所有行都等於它們自己。 您需要限制它們,以便它們必須是不同的行。

我假設你有某種主鍵ID列。

SELECT * 
FROM ATable a, ATable b 
Where a.colValue = b.colValue 
and a.colValue2 = b.colValue2 
and a.Id!= b.Id 

你必須要考慮的另一件事是,如果你有行:

ID  ColValue  ColValue2 ColValue3 
1   A   B   C 
2   A   B   D 

你會看到:

a.id a.ColValue a.ColValue2 a.ColValue3 b.id b.ColValue b.ColValue2 b.ColValue3 
1 A   B   C   2 A   B   D 
2 A   B   D   1 A   B   C 

因爲第1行是一樣的第2行。但第2行也與第1行相同。

+0

有趣的是,我實際上沒有rowID,因爲每個字段都可以允許重複。 (技術上這是一個oracle臨時表),所以我將不得不添加一個我想,所以我有某種獨特的價值來比較。非常感謝您回答這個問題。 – dee 2012-02-27 18:00:39

+0

哦,我應該在這裏補充一點,Oracle有一個已經叫做rowid的僞列,所以如果我不需要它,甚至不必實際製作和維護一個pk。對我來說。 – dee 2012-02-27 18:29:33

1

您正在做的正確...對於每一行,您將獲得自己以及與您指定的列匹配的所有其他行,這些行應該是表中行總數的最小值,並且可能會更多。

+0

是的,沒有道理,唯一的麻煩是我只需要匹配的那一行返回一次。 – dee 2012-02-27 17:58:34

0

您是否嘗試查找重複的行?

SELECT count(a.id) as cnt 
FROM ATable a 
GROUP BY a.colValue 
WHERE cnt>1 
+0

感謝您的回答。我實際上不是在尋找重複的行,只有大約7個列值中的3個與同一個表中至少一個其他行相同的行。 – dee 2012-02-27 17:57:15

+0

這個問題首先在我看來相當於找到相同的行)對不起) – ZloyPotroh 2012-02-27 18:07:10

相關問題