【问题标题】:How to remove duplicates with one query in h2如何在 h2 中使用一个查询删除重复项
【发布时间】:2021-03-31 13:19:48
【问题描述】:

我需要删除特定字段 (instrument_id) 的重复记录,只保留 id 的第一条记录。

使用 MySQL 示例,此查询如下所示:

DELETE t1 FROM instrument_bit_detail t1, instrument_bit_detail t2
WHERE t1.id > t2.id AND
t1.instrument_id = t2.instrument_id;

建表示例:

CREATE TABLE `instrument_bit_detail` (
  `id` bigint(20) NOT NULL,
  `instrument_id` bigint(20) NOT NULL,
  `modification_time` datetime DEFAULT NULL
)

但是当使用H2hsqldb数据库时,这个查询无法执行,提示语法错误。

是否有某种方法可以完成类似于上述查询的重复删除,但可以在 h2hsqldb 数据库上完成?

【问题讨论】:

    标签: java h2 hsqldb


    【解决方案1】:

    这样的简单查询应该可以解决问题:

    DELETE FROM instrument_bit_detail t1
    WHERE t1.id > (SELECT MIN(t2.id) FROM instrument_bit_detail t2 WHERE t1.instrument_id = t2.instrument_id )
    

    编辑: 由于您似乎有一些语法错误,这是我在 h2 Web 控制台(版本 1.4.200)上测试的内容。

    创建表

    CREATE TABLE instrument_bit_detail (
      id bigint(20) NOT NULL,
      instrument_id bigint(20) NOT NULL,
      modification_time datetime DEFAULT NULL
    );
    

    用数据填充表格

    insert into instrument_bit_detail(id, instrument_id, modification_time) values(1,10, CURRENT_DATE);
    insert into instrument_bit_detail(id, instrument_id, modification_time) values(2,11, CURRENT_DATE);
    insert into instrument_bit_detail(id, instrument_id, modification_time) values(3,10, CURRENT_DATE);
    insert into instrument_bit_detail(id, instrument_id, modification_time) values(4,12, CURRENT_DATE);
    insert into instrument_bit_detail(id, instrument_id, modification_time) values(5,11, CURRENT_DATE);
    insert into instrument_bit_detail(id, instrument_id, modification_time) values(6,10, CURRENT_DATE);
    insert into instrument_bit_detail(id, instrument_id, modification_time) values(7,12, CURRENT_DATE);
    

    选择输出

    ID      INSTRUMENT_ID   MODIFICATION_TIME  
    1       10              2020-12-22 00:00:00
    2       11              2020-12-22 00:00:00
    3       10              2020-12-22 00:00:00
    4       12              2020-12-22 00:00:00
    5       11              2020-12-22 00:00:00
    6       10              2020-12-22 00:00:00
    7       12              2020-12-22 00:00:00
    

    运行删除

    DELETE FROM instrument_bit_detail t1 WHERE t1.id > (SELECT MIN(t2.id) FROM instrument_bit_detail t2 WHERE t1.instrument_id = t2.instrument_id );
    

    删除后选择输出

    ID      INSTRUMENT_ID   MODIFICATION_TIME  
    1       10              2020-12-22 00:00:00
    2       11              2020-12-22 00:00:00
    4       12              2020-12-22 00:00:00
    

    【讨论】:

      猜你喜欢
      • 2016-07-20
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-09
      相关资源
      最近更新 更多