Удаление дубликата в БД (postgresql), с условияем where из нескольких таблиц
База PG Имеются две таблицы: Таблица INFO , с данными:
Таблица ADDON , связаны между друг другом по столбцу number
Мне надо найти и удалить дубликат в таблице INFO. Дубликат будет считаться записью где одинаковые значения в столбцах number,id,content. При этом в таблице для этого number, поля status и type ='1'.
Найти дублирующую (нужную запись), проблем не возникает.
select i.number,i.id,i.content from INFO i
join ADDON a using(number)
where a.status ='1'
and a.type ='1'
group by i.number,i.id,i.content having count(*) >1
Вывод:
не могу понять как корректо, не удаляя ничего лишнего, удалить вторую дублирующую строчку. При этом первая должна остаться без изменений. По логике тут можно уже добавлять delete from INFO ... но что-то не могу подобрать верное решение. Возможно и селект можно сделать менее топорным.
with dubli as
(
select i.number,i.id,i.content from INFO i
join ADDON a using(number)
where a.status ='1'
and a.type ='1'
group by i.number,i.id,i.content having count(*) >1
--поиск дублей
)
select inf.* from INFO inf
join dubli using (number)
where inf.number=dubli.number
and inf.id=dubli.id
and inf.content=dubli.content
--что-бы вывел 2 строки, вторую нужно удалить
Для создания аналогичных таблиц
create TABLE INFO
(number integer,
id integer,
content integer,
flag integer
)
create TABLE ADDON
(number integer,
status integer,
type integer
)
insert into INFO values
('4111','1','354911','1'),
('4111','1','354911','2'),
('4111','2','354912','3'),
('4112','1','354913','1'),
('4113','1','354914','1')
insert into ADDON values
('4111','1','1'),
('4112','1','1'),
('4113','1','1')
Получилось удалить нужную строку, но какими то костылями...
with dubli as
(
select i.number,i.id,i.content,i.flag from INFO i
join ADDON a using(number)
where a.status ='1'
and a.type ='1'
group by i.number,i.id,i.content having count(*) >1
--поиск дублей
),
alldubli as
(
select inf.* from INFO inf
join dubli using (number)
where inf.number=dubli.number
and inf.id=dubli.id
and inf.content=dubli.content
--вывод все строк
)
delete from INFO
where number in (select number from alldubli)
and id in (select id from alldubli)
and content in (select content from alldubli)
and flag in (select max(flag) from alldubli)
--удаление нужной