【问题标题】:Delete duplicate rows from SELECT query?从 SELECT 查询中删除重复的行?
【发布时间】:2020-11-06 20:34:47
【问题描述】:

我正在使用 SQLite,目前正尝试从某个用户(ID 为 12345)中删除某些重复的行。我已经设法确定了我希望删除的所有行,但我现在不确定如何删除这些行。这是我的SELECT 查询:

SELECT t.*
from (select t.*, count(*) over (partition by code, version) 
as cnt from t) t
where cnt >= 2 and userID = "12345";

我将如何删除与此结果匹配的行?我可以以某种方式使用上面的查询来确定我要删除哪些行吗?提前致谢!

【问题讨论】:

    标签: sql database sqlite


    【解决方案1】:

    您可以使用此查询获得userid = '12345' 的所有重复的code, version 组合:

    select code, version
    from tablename
    where userid = '12345'
    group by code, version
    having count(*) > 1
    

    您可以在DELETE 语句中使用它:

    delete from tablename 
    where userid = '12345'
    and (code, version) in (
      select code, version
      from tablename
      where userid = tablename.userid
      group by code, version
      having count(*) > 1
    )
    

    如果您想保留 1 个重复行,请使用 MIN() 窗口函数获取 code, version 的每个组合的最小 rowid 的行并将其排除在删除之外:

    delete from tablename 
    where userid = '12345'
    and rowid not in (
      select distinct min(rowid) over (partition by code, version)
      from tablename
      where userid = tablename.userid
    )
    

    【讨论】:

    • 我明白了。如果用户 12345 有 2 行具有相同的值,是否可以只删除其中一个重复行?
    • 如果其中一个重复行由 12345 以外的其他用户“拥有”,这可以工作吗?或者两行都必须由 12345“拥有”?
    • 我明白了。为了让它与 12345 和另一个用户“拥有”的行一起工作,我需要修改什么?只删除 12345 拥有的行。
    • 这是一个不同的要求,你应该发布一个新问题,你必须解释你想要什么。
    【解决方案2】:

    嗯。 . .你不必使用窗口函数:

    delete from t
        where exists (select 1
                      from t t2
                      where t2.code = t.code and t2.version = t.version
                      group by code, version
                      having count(*) >= 2
                     );
    

    【讨论】:

    • 在这种情况下t2 是什么?
    • @Californium 。 . .它是在子查询中引用您的(未命名的)表的表别名。我注意到这个答案比另一个答案早了 12 分钟。
    猜你喜欢
    • 2017-09-25
    • 2021-05-09
    • 2021-11-07
    • 1970-01-01
    • 2020-02-17
    • 2014-04-19
    • 2014-07-03
    • 2014-09-23
    • 2022-11-29
    相关资源
    最近更新 更多