微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

优化删除SQLite3中具有最高用户ID或rowid的重复行之一?

如何解决优化删除SQLite3中具有最高用户ID或rowid的重复行之一?

我在删除属于 a) 同一用户或 b) 不同用户的重复行时遇到了一些问题。

对于情况 a) 我想删除其中一个重复的行,对于情况 b) 我想删除具有最高用户 ID 的行。

示例

在下表中,我有 2 个重复的行,一个代码 A,问题是 1;一个带有代码 B 和问题 1。代码 B 由 2 个不同的用户“拥有”,在这种情况下我想删除用户 2,因为他们拥有最高的用户 ID。

对于代码为 A 的行;我想删除其中一行。由于它们是相同的,我只想要该行的 1 个副本。

+--------+------+-------+
| UserID | Code | Issue |
+--------+------+-------+
| 1      | A    | 1     |
+--------+------+-------+
| 1      | A    | 1     |
+--------+------+-------+
| 1      | B    | 1     |
+--------+------+-------+
| 2      | B    | 1     |
+--------+------+-------+

想要的结果

+--------+------+-------+
| UserID | Code | Issue |
+--------+------+-------+
| 1      | A    | 1     |
+--------+------+-------+
| 1      | B    | 1     |
+--------+------+-------+

我之前曾尝试使用:

create table temp_data as
    select t.*
    from data t
    where t.id = (select max(t2.id)
                  from data t2
                  where t2.code = t.code and t2.issue = t.issue
                 );

作为 proposed 步骤 1 的一部分,但无法处理情况 a)。我可以做些什么来处理 a) 重复行的情况?

解决方法

虽然您的表似乎没有 PRIMARY KEY,但您可以使用列 rowid 和列 UserID 来决定将删除哪些行:

DELETE FROM Data
WHERE EXISTS (
  SELECT 1 
  FROM Data d 
  WHERE d.Code = Data.Code AND d.Issue = Data.Issue 
  AND (d.rowid < Data.rowid OR d.UserID < Data.UserID)
)

参见demo
。 结果:

用户名 代码 问题
1 A 1
1 B 1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。