首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除SQLBase上的重复项

删除SQLBase上的重复项
EN

Stack Overflow用户
提问于 2015-10-12 10:58:23
回答 3查看 257关注 0票数 0

Im目前运行一个SQLBase数据库,并尝试了几个是选择和删除重复的项目。

这里有一个场景:

代码语言:javascript
复制
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是一个虚拟列。这是由系统创建的。

我想要做的是删除所有的副本,这样我就可以得到:

代码语言:javascript
复制
||=========||=========||==================||
|| column1 || column2 || rowid            ||
||=========||=========||==================||
||    1    ||    1    || AAAAAAAAAAAAAAAA ||
||    1    ||    2    || DDDDDDDDDDDDDDDD ||
||    1    ||    3    || FFFFFFFFFFFFFFFF ||
||    1    ||    4    || GGGGGGGGGGGGGGGG ||
||=========||=========||==================||

问题是,它在SQLBase中,并且没有迭代我的副本的函数。

我发现复制件如下:

代码语言:javascript
复制
SELECT column1, column2 COUNT(*) 
FROM test1 
GROUP BY column1, column2 
HAVING COUNT(*) > 1;

这就是我的问题。找不到办法从那一点上删除它们。而且,由于使用了rowid语句,我显然无法将group by添加到重复的select中。

是否有可能删除重复项,以便每个column1column2组合只有一个条目

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-12 13:34:25

对于要删除的查找行,可以使用更好的选择:

代码语言:javascript
复制
select a.rowid 
from test1 a 
where a.rowid not in 
(
   select max (x.rowid)
   from test1 x
   group by x.column1, x.column2
);

不幸的是,不适用于:

代码语言:javascript
复制
delete
from test1 a 
where a.rowid not in 
(
   select max (x.rowid)
   from test1 x
   group by x.column1, x.column2
);

但是您可以使用两个sql句柄来删除它:

代码语言:javascript
复制
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存储过程:

代码语言:javascript
复制
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)
/   
票数 2
EN

Stack Overflow用户

发布于 2017-11-02 23:02:04

可以在SQLBase存储过程中使用SAL和Sql语句。根据ZephyCZ给出的示例。若要从SQLTalk中一步检索和执行存储过程,请使用execute命令。此命令接受输入值并检索数据(如果需要)并执行存储过程;例如:

执行delDuplicityTest1 \ 1,50,/

票数 0
EN

Stack Overflow用户

发布于 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 );

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33079411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档