两列中的SQL重复数据删除

lig*_*txx 5 sql duplicates ignore-duplicates

我已经在这方面苦苦挣扎了很长一段时间,但我无法理解.

我有一个有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 - | 阿贝尔,古斯塔夫 - | 阿贝莱,古斯塔夫| 1
3 - | 阿贝尔,古斯塔夫| 阿贝尔,古斯塔夫 - | 1
4 - | 阿贝莱,古斯塔夫| 阿贝尔,古斯塔夫 - | 1

to
| ------ autor1 ---- | ------ autor2 ----- | dld
| 阿贝尔,古斯塔夫 - | 阿贝尔,古斯塔夫| 1
| 阿贝尔,古斯塔夫 - | 阿贝莱,古斯塔夫| 1

Lie*_*ers 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
       )
Run Code Online (Sandbox Code Playgroud)

编辑

一步一步,以下是声明背后的逻辑细分

  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(否) - > 包含