Удаление дубликатов базы данных H2 - PullRequest
1 голос
/ 22 марта 2019

Я хочу работать с дублирующимися строками в таблице базы данных H2 (удастся УДАЛИТЬ, УСТАНАВЛИВАЯ другое значение).

Давайте подготовим несколько примеров данных:

create table receipt( id int primary key, receipt_number varchar(52), shop_id int);
insert into receipt(id, receipt_number, shop_id) values(1,'A',1);
insert into receipt(id, receipt_number, shop_id) values(2,'A',1);
insert into receipt(id, receipt_number, shop_id) values(3,'B',1);
insert into receipt(id, receipt_number, shop_id) values(4,'A',2);
select * from receipt;
select receipt_number, shop_id, count(*) count from receipt group by (receipt_number, shop_id);

, которыеприводит нас к:

sql output

Я думал, что этого утверждения будет достаточно:

merge into receipt as t1
using ( select receipt_number, shop_id, count(*) count from receipt group by (receipt_number, shop_id) ) as t2 on t1.receipt_number = t2.receipt_number
when matched and count > 1 then delete;

, но возникает исключение:

Syntax error in SQL statement "MERGE INTO RECEIPT AS T1 
    USING ( SELECT RECEIPT_NUMBER, SHOP_ID, COUNT(*) COUNT FROM RECEIPT GROUP BY (RECEIPT_NUMBER, SHOP_ID) ) AS T2 ON T1[*].RECEIPT_NUMBER = T2.RECEIPT_NUMBER 
    WHEN MATCHED AND COUNT > 1 THEN DELETE "; expected "("; SQL statement:
merge into receipt as t1 
    using ( select receipt_number, shop_id, count(*) count from receipt group by (receipt_number, shop_id) ) as t2 on t1.receipt_number = t2.receipt_number 
    when matched and count > 1 then delete [42001-197] 42001/42001

Вы можете легко протестировать мой код:

docker run -d -p 1521:1521 -p 8082:81  oscarfonts/h2 

, перейдите к http://localhost:8082/, войдите и скопируйте и вставьте код.

1 Ответ

0 голосов
/ 22 марта 2019

Я думаю, что решил это с

delete receipt 
where id > (select min(id) from receipt t2 where receipt.receipt_number = t2.receipt_number and receipt.shop_id = t2.shop_id )

думаю, я тоже могу использовать его для update.

...