Удаление дубликатов в SQLBase

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

Вот сценарий:

Tablename: test1

||=========||=========||==================||
|| column1 || column2 || rowid            ||
||=========||=========||==================||
||    1    ||    1    || AAAAAAAAAAAAAAAA ||
||    1    ||    1    || BBBBBBBBBBBBBBBB ||
||    1    ||    1    || CCCCCCCCCCCCCCCC ||
||    1    ||    2    || DDDDDDDDDDDDDDDD ||
||    1    ||    2    || EEEEEEEEEEEEEEEE ||
||    1    ||    3    || FFFFFFFFFFFFFFFF ||
||    1    ||    4    || GGGGGGGGGGGGGGGG ||
||=========||=========||==================||

RowID - это виртуальный столбец. Это создается системой.

Я хочу удалить все дубликаты, чтобы я получил:

||=========||=========||==================||
|| column1 || column2 || rowid            ||
||=========||=========||==================||
||    1    ||    1    || AAAAAAAAAAAAAAAA ||
||    1    ||    2    || DDDDDDDDDDDDDDDD ||
||    1    ||    3    || FFFFFFFFFFFFFFFF ||
||    1    ||    4    || GGGGGGGGGGGGGGGG ||
||=========||=========||==================||

Проблема в том, что он находится в SQLBase, и нет функции, которая повторяет мои дубликаты.

Я нахожу дубликаты как:

SELECT column1, column2 COUNT(*) 
FROM test1 
GROUP BY column1, column2 
HAVING COUNT(*) > 1;

И есть моя проблема. Не могу найти способ удалить их с этого момента. Также я, очевидно, не могу добавить rowid к дубликату выберите из-за group by заявление.

Есть ли возможность удалить дубликаты? column1 унд column2?

3 ответа

Решение

Чтобы найти строки для удаления, вы можете использовать лучше выбрать:

select a.rowid 
from test1 a 
where a.rowid not in 
(
   select max (x.rowid)
   from test1 x
   group by x.column1, x.column2
);

К сожалению, не применяется:

delete
from test1 a 
where a.rowid not in 
(
   select max (x.rowid)
   from test1 x
   group by x.column1, x.column2
);

Но вы можете удалить это с двумя дескрипторами sql:

Call SqlPrepareAndExecute(hSql1, 'select a.rowid from test1 ...(like above)...into :sRowid')
While SqlFetchNext(hSql1, nFetch)
   Call SqlPrepareAndExecute(hSql2, 'delete from test1 where rowid = :sRowid')

Пример как хранимая процедура Sql Base:

Procedure: delDuplicityTest1
Parameters
Local Variables
   Sql Handle: hSql1
   Sql Handle: hSql2
   String: sSelect
   String: sRowid
   Number: nFetch
Actions
      Call SqlConnect(hSql1)
      Call SqlConnect(hSql2)
      Set sSelect = 'select a.rowid 
                     from test1 a 
                     where a.rowid not in 
                     (
                        select min (x.rowid)
                        from test1 x
                        group by x.column1, x.column2
                     )
                     into :sRowid '
      Call SqlPrepareAndExecute(hSql1, sSelect)
      While SqlFetchNext(hSql1, nFetch)
         Call SqlPrepareAndExecute(hSql2, 'delete from test1 where rowid = :sRowid')

      Call SqlCommit(hSql2)
      Call SqlDisconnect(hSql1)
      Call SqlDisconnect(hSql2)
/   

Вы можете использовать операторы SAL и Sql в хранимой процедуре SQLBase. Согласно примеру, приведенному ZephyCZ. Чтобы извлечь и выполнить хранимую процедуру за один шаг из SQLTalk, используйте команду EXECUTE. Эта команда принимает входные значения и извлекает данные (при необходимости), а также выполняет хранимую процедуру; например:

EXECUTE delDuplicityTest1 \ 1,50,, /

Для этих целей SqlBase не так терпим, как другие СУБД.

Самый простой способ - автоматически сгенерировать операторы удаления.

select 'delete from test1 where rowid = ''' || a.rowid ''';' from test1 a where a.rowid not in ( select max (x.rowid) from test1 x group by x.column1, x.column2 );

Другие вопросы по тегам