【问题标题】:SQL deduplicate from two columns从两列进行 SQL 重复数据删除
【发布时间】:2012-05-07 12:29:28
【问题描述】:

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

我有一个包含 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

【问题讨论】:

    标签: sql duplicates ignore-duplicates


    【解决方案1】:

    使用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(无)-> 包含

    【讨论】:

    • 你是个天才。虽然恐怕我不完全理解“大于”的魔法是如何工作的。
    • @lightxx - 我添加了语句背后的逻辑细分。希望它能让事情有所澄清。
    • 我认为AND yti.id > yto.id 的部分救了我的命。这可以防止重复感谢您的解决方案。
    猜你喜欢
    • 2021-01-15
    • 2016-08-07
    • 2021-11-11
    • 2016-08-29
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多