删除 SQLBase 上的重复项
Deleting duplicates on SQLBase
我目前 运行 一个 SQLBase 数据库并尝试了几个 select 并删除重复项。
这里有一个场景:
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;
这是我的问题。从那时起找不到删除它们的方法。
另外,由于 group by
语句,我显然不能将 rowid
添加到重复的 select 中。
是否有可能删除重复项,使 column1
和 column2
的每个组合只有一个条目?
对于查找要删除的行,你可以使用更好的select:
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)
/
出于这些目的,SqlBase 不像其他 DBMS 那样宽容。
最简单的方法是自动生成删除语句。
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
);
您可以在 SQLBase 存储过程中使用 SAL 和 Sql 语句。根据 ZephyCZ 给出的示例。要从 SQLTalk 一步检索和执行存储过程,请使用 EXECUTE 命令。此命令接受输入值并检索数据(如果需要)以及执行存储过程;例如:
执行 delDuplicityTest1
\
1,50,
/
我目前 运行 一个 SQLBase 数据库并尝试了几个 select 并删除重复项。
这里有一个场景:
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;
这是我的问题。从那时起找不到删除它们的方法。
另外,由于 group by
语句,我显然不能将 rowid
添加到重复的 select 中。
是否有可能删除重复项,使 column1
和 column2
的每个组合只有一个条目?
对于查找要删除的行,你可以使用更好的select:
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)
/
出于这些目的,SqlBase 不像其他 DBMS 那样宽容。
最简单的方法是自动生成删除语句。
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
);
您可以在 SQLBase 存储过程中使用 SAL 和 Sql 语句。根据 ZephyCZ 给出的示例。要从 SQLTalk 一步检索和执行存储过程,请使用 EXECUTE 命令。此命令接受输入值并检索数据(如果需要)以及执行存储过程;例如:
执行 delDuplicityTest1 \ 1,50, /