5

我已经为此苦苦挣扎了一段时间,但我就是想不通。

我有一个有 3 列的表。2 列包含名称,第三列包含这些名称之间的 Damerau Levensthein 距离 ( http://en.wikipedia.org/wiki/Damerau%E2%80%93Levenshtein_distance )。

每列都包含每个名称,这意味着出现在 autor1 列中的所有名称也出现在 autor2 列中。结果,我需要两倍的行,只是交换了 autor1 和 autor2 列。

例如,第 3 行等于第 1 行,只是交换了自动列,第 2-4 行也是如此。我将如何制定一个省略那些“重复”的查询?
id-|-----auto1----|-----auto2-----| dld
1 -| 阿贝尔,古斯塔夫-| 亚伯,古斯塔夫 | 1
2 -| 阿贝尔,古斯塔夫-| 阿贝尔,古斯塔夫 | 1
3 -| 亚伯,古斯塔夫| 阿贝尔,古斯塔夫 --| 1
4 -| 阿贝尔,古斯塔夫 | 阿贝尔,古斯塔夫-| 1


|-----auto1----|-----auto2-----| dld
| 阿贝尔,古斯塔夫-| 亚伯,古斯塔夫 | 1
| 阿贝尔,古斯塔夫-| 阿贝尔,古斯塔夫 | 1

4

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. 是否有记录 where ID > 1and autor1 = autor2(Yes, ID 3) -> Ignore
  3. 获取下一条记录 ( ID = 2)
  4. 是否有记录 where ID > 2and autor1 = autor2(Yes, ID 4) -> Ignore
  5. 获取下一条记录 ( ID = 3)
  6. 是否有记录 where ID > 3and autor1 = autor2(No) -> Include
  7. 获取下一条记录 ( ID = 4)
  8. 是否有记录 where ID > 4and autor1 = autor2(No) -> Include
于 2012-05-07T12:31:16.207 回答