【问题标题】:Suppressing Duplicates on a Sqlite Database抑制 Sqlite 数据库上的重复项
【发布时间】:2018-08-01 03:40:51
【问题描述】:

我正在尝试使用此请求抑制表中的重复项:

DELETE FROM tb_entry t1
WHERE entry_id < ANY (SELECT entry_id
FROM tb_entry t2
WHERE t1.entry_id <> t2.entry_id
AND t1.entry_sdate = t2.entry_sdate
AND t1.entry_edate = t2.entry_edate
AND t1.entry_nid = t2.entry_nid
AND t1.entry_msg_grp = t2.entry_msg_grp)

我遇到的第一个错误是:

near "t1": syntax error: DELETE FROM tb_entry t1

我应该怎么做才能让它工作?

【问题讨论】:

    标签: sql sqlite duplicates


    【解决方案1】:

    我认为 SQLite 不允许在 delete 中使用别名。试试:

    DELETE FROM tb_entry
    WHERE entry_id > (SELECT MIN(t2.entry_id)
                      FROM tb_entry t2
                      WHERE tb_entry.entry_sdate = t2.entry_sdate AND
                            tb_entry.entry_edate = t2.entry_edate AND
                            tb_entry.entry_nid = t2.entry_nid AND
                            tb_entry.entry_msg_grp = t2.entry_msg_grp
                    );
    

    我重写了逻辑以引用最小值id。我认为这比&lt; ANY 更容易理解,因为&lt; ANY 子查询选择所有其他ID。

    【讨论】:

      【解决方案2】:

      不确定是否出于某种原因要保留最低/最大 id,或者您不在乎保留哪一个

      我的建议是依靠 GROUP BY 从每组重复项中选择一个

      DELETE FROM tb_entry
      WHERE entry_id NOT IN (
          SELECT MIN(entry_id)
          FROM tb_entry
          GROUP BY entry_sdate,entry_edate,entry_nid,entry_msg_grp
      )
      

      示例:https://sqliteonline.com/#fiddle-5a8d7f7a293c19gdjdx5xv7h

      【讨论】:

        猜你喜欢
        • 2015-06-02
        • 2012-12-04
        • 1970-01-01
        • 2011-11-20
        • 2012-01-02
        • 1970-01-01
        • 1970-01-01
        • 2021-10-20
        • 1970-01-01
        相关资源
        最近更新 更多