2012-05-07 18 views
5

Od pewnego czasu borykam się z tym problemem, ale nie mogę tego rozgryźć.Deduplikacja SQL z dwóch kolumn

Mam tabelę z 3 kolumnami. 2 kolumny zawierające nazwy i trzecia zawierająca odległość Damerau Levensthein (http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance) pomiędzy tymi nazwami.

każda kolumna zawiera wszystkie pojedyncze nazwy, co oznacza, że ​​wszystkie nazwiska obecne w kolumnie autor1 są również obecne w kolumnie autor2. w rezultacie mam dwa razy potrzebne wiersze, po prostu z zamienionymi kolumnami autor1 i autor2.

jako przykład, wiersz 3 jest równy rzędowi 1, tylko z zamienionymi kolumnami autorki, to samo dotyczy 2-4. jak sformułować zapytanie pomijające te "duplikaty"?
id- | ------ autor1 ---- | ------ autor2 ----- | dld
1 - | Abel, Gustav - | Abel, Gustave | 1
2 - | Abel, Gustav - | Abele, Gustav | 1
3 - | Abel, Gustave | Abel, Gustav - | 1
4 - | Abele, Gustav | Abel, Gustav - | 1

do
| ------ autor1 ---- | ------ autor2 ----- | dld
| Abel, Gustav - | Abel, Gustave | 1
| Abel, Gustav - | Abele, Gustav | 1

Odpowiedz

10

Korzystanie z NOT EXISTS działa we wszystkich znanych aplikacjach DBMS. Złożoność złożoności tego jest, aby nie zapomnieć o włączeniu klauzuli na id. Bez niego nic nie zostanie zwrócone.

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

Edit

krok po kroku Poniżej znajduje się podział logiki rachunku

  1. Pobierz pierwszy rekord (ID = 1)
  2. Czy istnieje zapis gdzie ID > 1 i autor1 = autor2 (Tak, ID 3) ->Ignoruj ​​
  3. Get następny rekord (ID = 2)
  4. Czy istnieje zapis gdzie ID > 2 i autor1 = autor2 (Tak, ID 4) ->Ignoruj ​​
  5. Get następny rekord (ID = 3)
  6. Czy istnieje zapis gdzie ID > 3 i autor1 = autor2 (Nie) ->Dołącz
  7. Get następny rekord (ID = 4)
  8. Czy istnieje zapis gdzie ID > 4 i autor1 = autor2 (Nie) ->Dołącz
+1

jesteś geniuszem. chociaż obawiam się, że nie rozumiem w pełni, jak działa "większa niż" magia. – lightxx

+1

@lightxx - Dodałem podział logiki za stwierdzeniem. Mam nadzieję, że trochę się rozjaśni. –

+0

dzięki, znowu.rządzisz!! – lightxx

Powiązane problemy