Как мы можем удалить повторяющиеся строки в sybase IQ?

У меня есть таблица, и в ней нет столбца id. как удалить повторяющиеся строки?

Я пробовал это:

 with cte(rwn,name, lastname,dt) as(
              select ROW_NUMBER() over(partition by name, lastname,dt order by name) as rwn,name, lastname,dt from duplicateRowDelete
             )
  delete cte where  cte.rwn <> 1

Выдает ошибку: SQL Anywhere Error -131: синтаксическая ошибка рядом с «удалить» в строке 4


person Selçuk Kılınç    schedule 10.10.2017    source источник


Ответы (1)


Если Sybase IQ не поддерживает обновляемые CTE или подзапросы, это сложно. Один из способов — воссоздать таблицу. Я думаю, это сработает:

select *
into #tempt
from (select t.*,
             row_number() over (partition by name, lastname, dt order by name) as seqnum
      from duplicateRowDelete
     ) t
where seqnum = 1;

truncate table duplicateRowDelete;

insert into duplicateRowDelete(name, lastname, dt, . . .)
    select name, lastname, dt, . . .
    from #tempt;

Преимущество этого заключается в том, что он работает быстрее, если вам нужно удалить значительную часть таблицы.

person Gordon Linoff    schedule 10.10.2017
comment
Я не должен удалять таблицу. - person Selçuk Kılınç; 10.10.2017
comment
@SelçukKılınç . . . Это не удаляет таблицу. Он опорожняет его и перезагружает. - person Gordon Linoff; 10.10.2017
comment
довольно опасно а) размещение всех хороших строк в таблице #temp (которая исчезнет, ​​если вы потеряете соединение), б) стирание содержимого исходной таблицы без 100% гарантии того, что вы сможете вернуть исходные/хорошие строки, и c) выполнение всей этой работы вне транзакции (опять же, рискуя потерять все данные при таком дизайне). - person markp-fuso; 11.10.2017
comment
@маркп . . . ОП также может использовать обычную таблицу. Идея действительно та же. - person Gordon Linoff; 11.10.2017