2012-05-07 55 views
5

我一直在爲此奮鬥了很長一段時間,但我無法弄清楚。來自兩列的SQL重複數據刪除

我有一張3列的表格。 2列包含名稱,第三列包含這些名稱之間的Damerau Levensthein距離(http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance)。

每列都包含每一個單獨的名字,這意味着autor1列中的所有名字也出現在autor2列中。結果我有兩次所需的行,只是交換了autor1和autor2列。

作爲一個例子,第3行等於第1行,只是交換了autor列,同樣也是2-4。我將如何制定一個查詢,省略這些「重複」?
id- | ------ autor1 ---- | ------ autor2 ----- | dld
1 - |亞伯,古斯塔夫 - |亞伯,古斯塔夫| 1
2 - |亞伯,古斯塔夫 - | Abele,Gustav | 1
3 - |亞伯,古斯塔夫|亞伯,古斯塔夫 - | 1
4 - | Abele,Gustav |亞伯,古斯塔夫 - | 1


| ------ autor1 ---- | ------ autor2 ----- | dld
|亞伯,古斯塔夫 - |亞伯,古斯塔夫| 1
|亞伯,古斯塔夫 - | Abele,Gustav | 1

回答

10

使用NOT EXISTS適用於我所知道的所有DBMS。這個的複雜性是不要忘記在id包括一個條款。沒有它,什麼都不會返回。

SELECT * 
FROM YourTable yto 
WHERE NOT EXISTS (
     SELECT * 
     FROM YourTable yti 
     WHERE yti.autor2 = yto.autor1 
       AND yti.id > yto.id 
     ) 

編輯

一步一步,以下是聲明

  1. 背後的邏輯的擊穿獲取的第一條記錄(ID = 1
  2. 是否有記錄,其中ID > 1autor1 = autor2(是,ID 3) - >忽略
  3. 獲取下一個記錄(ID = 2
  4. 是否有記錄,其中ID > 2autor1 = autor2(是的,ID 4) - >忽略
  5. 獲取下一個記錄(ID = 3
  6. 是否有記錄,其中ID > 3autor1 = autor2(否) - >包括
  7. 獲取下一個記錄(ID = 4
  8. 是否存在這樣一種記錄ID > 4autor1 = autor2(否) - >包括
+1

你是一個天才。儘管恐怕我不完全理解「大於」魔法的作用。 – lightxx

+1

@lightxx - 我已經添加了語句背後邏輯的細分。希望它可以清理一些東西。 –

+0

再次感謝。你搖滾! – lightxx