Im目前运行一个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添加到重复的select中。
是否有可能删除重复项,以便每个column1和column2组合只有一个条目
发布于 2015-10-12 13:34:25
对于要删除的查找行,可以使用更好的选择:
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)
/ 发布于 2017-11-02 23:02:04
可以在SQLBase存储过程中使用SAL和Sql语句。根据ZephyCZ给出的示例。若要从SQLTalk中一步检索和执行存储过程,请使用execute命令。此命令接受输入值并检索数据(如果需要)并执行存储过程;例如:
执行delDuplicityTest1 \ 1,50,/
发布于 2017-01-02 15:52:37
出于这些目的,SqlBase不像其他DBMS那样宽容。
最简单的方法是自动生成delete语句。
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 );
https://stackoverflow.com/questions/33079411
复制相似问题