Удаление повторяющихся строк из таблицы Advantage Database Server 10.1

У меня есть большая таблица DBF в ADS, которая может содержать повторяющиеся записи. Дублирующаяся запись идентифицируется любой записью, в которой field2, field3, field5, field4, field8 и field7 соответствуют другой записи. Мне нужно определить повторяющиеся записи и удалить их. Для этого я пытаюсь записать набор записей во вторую таблицу. Несмотря на то, что повторяющаяся запись идентифицируется шестью полями, мне нужно записать всю запись, 30 полей, во вторую таблицу. Я пробовал следующий код:

insert into table2 select * from table1 where (
  field2, field3, field5, field4, field8, field7
) in (
  select field2, field3, field5, field4, field8, field7
  from table1 where field3 not like '%FOO%' and field3 not like '%BOO%'
  group by field2, field3, field5, field4, field8, field7 having count(*) > 1
)

Сообщение об ошибке ADS: ОШИБКА В СЦЕНАРИИ: poQuery: Ошибка 7200: Ошибка AQE: Состояние = 42000; Нативеррор = 2115; [Решения iAnywhere][Advantage SQL Engine]Ожидаемый лексический элемент не найден:) Возникла проблема при синтаксическом анализе предложения WHERE в операторе SELECT.

Любая помощь приветствуется.


person Mark    schedule 19.06.2015    source источник
comment
Ух ты. Это даже близко не соответствует правильному синтаксису SQL на любом диалекте. :-) Можете ли вы опубликовать некоторые примеры данных (на основе столбцов, которые вам действительно нужны)? Кроме того, перед попыткой ВСТАВИТЬ поработайте над тем, чтобы просто ВЫБРАТЬ строки. Когда у вас это получится, тогда выясните, как вставить их в другую таблицу.   -  person Ken White    schedule 19.06.2015


Ответы (2)


Пока у вас уже есть альтернативная таблица с этими столбцами, у вас должно быть хорошо с...

insert into table2 
  ( field2, field3, field5, field4, field8, field7 ) 
select 
      field2, field3, field5, field4, field8, field7
   from 
      table1 
   where 
          field3 not like '%FOO%' 
      and field3 not like '%BOO%'
   group by 
      field2, 
      field3, 
      field5, 
      field4, 
      field8, 
      field7 
   having 
      count(*) > 1  )
person DRapp    schedule 20.06.2015

Я думаю, что самым простым ответом было бы просто удалить все повторяющиеся записи, сохранив при этом только первую. Вот что я имею в виду:

DECLARE tbl CURSOR;

//1st find duplicate records
OPEN tbl AS SELECT DISTINCT a.field1, a.field2, a.field3...
              FROM (SELECT d1.field1, d1.field2, d1.field3... 
                      FROM table1 d1 
                    HAVING COUNT(*) > 1 ) a ;

//now traverse cursor containing duplicate records
//deleting all duplicates from original table except 
//1st one

WHILE FETCH tbl DO 

    DELETE FROM table1 
     WHERE RowId > ( 
           SELECT MIN( d3.RowId )
             FROM table1 d3
            WHERE d3.field1 = tbl.field1
              AND d3.field2 = tbl.field2
              AND d3.field3 = tbl.field3 ... ) 
       AND table1.field1 = tbl.field1 
       AND table1.field2 = tbl.field2
       AND table1.field3 = tbl.field3 ;

END WHILE ;
CLOSE tbl ;

Если table1 индексируется по некоторым из этих полей (field1, field2, field3...) и в table1 не объявлены сложные триггеры «При удалении», то операция должна выполняться довольно быстро.

person reinaldo Crespo    schedule 23.06.2015