2015-10-12 8 views
0

В настоящее время я запускаю базу данных 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?

ответ

2

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

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:

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) 
/ 
+0

Это верно, если я хотел бы создать программка, чем это было бы в случае решить эту проблему. Но так как нет возможности сделать это в существующей программе, я должен справиться с этим, просто используя sqltalk. Можете ли вы узнать, как использовать хранимые процедуры в sqltalk? – Dwza

+0

Я добавил пример процедуры хранения, см. Выше. Это можно запустить в SqlTalk. Попробуй. – ZephyCZ

+0

Я должен попробовать это завтра. SqlTalk поддерживает функции Centura? Кстати, на самом деле нет необходимости совершать с подготовкой и исполнением. – Dwza

-1

Для этих целей 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 );

0

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

ВЫПОЛНИТЬ delDuplicityTest1 \ ,, 1,50/