Насколько я понимаю в Вашем примере будут удалены все записи в таблице начиная с некоторогo минимального значения CTID (+1) найденного в подзапросе. Это могут быть не только строки с a.fld1 = b.fld1 Проверьти сами. Я добавил, кмк, недостающий предикат в Ваш код выше.sp123 wrote: 11 Sep 2021 02:10zVlad wrote: 10 Sep 2021 22:38Ну и как?sp123 wrote: 09 Sep 2021 22:31Тут сразу же напрашивается классический вопрос для интервью - как удалить дубликаты одним sql стейтментомKinDzaDza wrote: В реальной же жизни как правило стоит прямо противоположная задача - с какого перепуга у нас тут появляются дубликаты и как их убрать. Но задачка для интервью неплохая.
Sent from my iPhone using Tapatalk Pro
create table my_table (fld1 varchar(10));
insert into my_table (fld1) values ('aaa'), ('aaa'), ('bbb'), ('aaa'), ('bbb'), ('ccc');
delete from my_table a where ctid > (select min(ctid) from my_table b where a.fld1 = b.fld1) and ctid in (select ctid from my_table b where a.fld1 = b.fld1);
Это ситаксис Postgres. Для Oracle все то же самое, только вместо CTID использовать ROWID. Какой аналог внутренненго уникального идентификатора записи в DB2 я не в курсе, но можно поиграться с row_number() over ().
В DB2 тоже есть тип данных ROWID. Физический Идентификатор строки существовал всегда, с самого начала, но в нем нужды для программистов не было никакой. Тем более что что в теории реляционных баз данных таблицы содержат физически неупорядоченый набор строк. Тип данных ROWID появился сравнительно недавно (см. ниже из reference) .
Вообще проблема дубликатов не такая тривиальная как Вы ее представили здесь. В Вашем случае с таблицей с одной колонкой все просто и понятно. Понятно и просто если мы говорим об уникальности в смысле значений всех столбцов таблицы. Но более распространенно что уникальность определяется по поднабору столбцов (ключу). И вот у Вас имеется строки с дублирирующими значениями в ключе и разными значениями в других столбцах. Ваши действия?
ROWID
For a row ID type.
A table can have only one ROWID column. The values in a ROWID
column are unique for every row in the table and cannot be updated. You
must specify NOT NULL with ROWID