从两个列中进行SQL去重

5

我已经苦苦挣扎了很长时间,但我就是想不出来。

我有一个包含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 -| Abel, Gustav -| Abel, Gustave | 1
2 -| Abel, Gustav -| Abele, Gustav | 1
3 -| Abel, Gustave| Abel, Gustav --| 1
4 -| Abele, Gustav | Abel, Gustav -| 1

结果:
|------autor1----|------autor2-----| dld
| Abel, Gustav -| Abel, Gustave | 1
| Abel, Gustav -| Abele, Gustav | 1

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 - 我已经添加了语句背后逻辑的分解。希望这能够澄清一些事情。 - Lieven Keersmaekers
我认为 AND yti.id > yto.id 这部分代码救了我的命。这可以防止重复。感谢您提供的解决方案。 - Ahmet DAL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接