两列中的SQL重复数据删除

时间:2012-05-07 12:29:28

标签: sql duplicates ignore-duplicates

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

我有一个包含3列的表格。 2列包含名称,第3列包含这些名称之间的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个


| ------ autor1 ---- | ------ ----- autor2 | DLD
|阿贝尔,古斯塔夫 - |阿贝尔,古斯塔夫| 1
|阿贝尔,古斯塔夫 - |阿贝莱,古斯塔夫| 1个

1 个答案:

答案 0 :(得分: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(否) - > 包含