Удаление дубликатов в 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
);