2012-05-07 4 views
5

Я довольно долго боролся с этим, но я просто не могу понять это.SQL-дедупликация из двух столбцов

У меня есть стол с 3 колонками. 2 столбца, содержащие имена и третий, содержащий расстояние Дамерау Левенштейна (http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance) между этими именами.

Каждый столбец содержит каждое имя, то есть все имена, присутствующие в столбце autor1, также присутствуют в столбце autor2. в результате у меня есть два раза требуемые строки, только с заменой столбцов autor1 и autor2.

как пример, строка 3 равна строке 1, только с колонками авторов, замененных, то же самое для 2-4. как бы я сформулировал запрос, который опускает эти «дубликаты»?
id- | ------ autor1 ---- | ------ autor2 ----- | dld
1 - | Абель, Густав - | Абель, Гюстав | 1
2 - | Абель, Густав - | Абеле, Густав | 1
3 - | Абель, Гюстав | Абель, Густав - | 1
4 - | Абеле, Густав | Абель, Густав - | 1


| ------ autor1 ---- | ------ autor2 ----- | dld
| Абель, Густав - | Абель, Гюстав | 1
| Абель, Густав - | Абеле, Густав | 1

ответ

10

Использование NOT EXISTS работает со всеми СУБД, о которых я знаю. Задача состоит в том, чтобы не забудьте включить пункт на 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 > 1 и autor1 = autor2 (Да, ID 3) ->Игнорировать
  3. Получить следующую запись (ID = 2)
  4. Есть запись, где ID > 2 и autor1 = autor2 (Да, ID 4) ->Игнорировать
  5. Получить следующую запись (ID = 3)
  6. Есть запись, где ID > 3 и autor1 = autor2 (Нет) ->Включить
  7. Получить следующую запись (ID = 4)
  8. есть запись, где ID > 4 и autor1 = autor2 (Нет) ->Включить
+1

ты гений. хотя я боюсь, что не совсем понимаю, как работает «больше, чем». – lightxx

+1

@lightxx - Я добавил разбивку логики заявления. Надеюсь, это немного облегчит ситуацию. –

+0

спасибо, еще раз.ты жжешь!! – lightxx