从 Advantage Database Server 10.1 表中删除重复行

Posted

技术标签:

【中文标题】从 Advantage Database Server 10.1 表中删除重复行【英文标题】:Removing Duplicate Rows From Advantage Database Server 10.1 Table 【发布时间】:2015-06-19 18:15:48 【问题描述】:

我在 ADS 中有一个可能包含重复记录的大型 DBF 表。重复记录由字段 2、字段 3、字段 5、字段 4、字段 8 和字段 7 与另一条记录匹配的任何记录标识。我需要识别重复记录并删除它们。为此,我试图将一组记录写入第二个表。即使重复记录由六个字段标识,我也需要将整个记录(30 个字段)写入第二个表。我试过以下代码:

insert into table2 select * from table1 where (
  field2, field3, field5, field4, field8, field7
) in (
  select field2, field3, field5, field4, field8, field7
  from table1 where field3 not like '%FOO%' and field3 not like '%BOO%'
  group by field2, field3, field5, field4, field8, field7 having count(*) > 1
)

ADS 错误消息:脚本中的错误:poQuery:错误 7200:AQE 错误:状态 = 42000;本机错误 = 2115; [iAnywhere Solutions][Adv​​antage SQL Engine]Expected lexical element not found:) 解析 SELECT 语句中的 WHERE 子句时出现问题。

感谢任何和所有的帮助。

【问题讨论】:

哇。这甚至不接近任何方言中的正确 SQL 语法。 :-) 您可以发布一些示例数据(基于您需要实际匹配的列)吗?此外,在尝试插入之前,请努力选择能够选择行。当你得到它的工作时,然后弄清楚如何将它们插入到另一个表中。 【参考方案1】:

只要您已经拥有可用于这些列的备用表,您就应该擅长...

insert into table2 
  ( field2, field3, field5, field4, field8, field7 ) 
select 
      field2, field3, field5, field4, field8, field7
   from 
      table1 
   where 
          field3 not like '%FOO%' 
      and field3 not like '%BOO%'
   group by 
      field2, 
      field3, 
      field5, 
      field4, 
      field8, 
      field7 
   having 
      count(*) > 1  )

【讨论】:

【参考方案2】:

我认为最简单的答案是删除所有重复记录,而只保留第一个。这就是我的意思:

DECLARE tbl CURSOR;

//1st find duplicate records
OPEN tbl AS SELECT DISTINCT a.field1, a.field2, a.field3...
              FROM (SELECT d1.field1, d1.field2, d1.field3... 
                      FROM table1 d1 
                    HAVING COUNT(*) > 1 ) a ;

//now traverse cursor containing duplicate records
//deleting all duplicates from original table except 
//1st one

WHILE FETCH tbl DO 

    DELETE FROM table1 
     WHERE RowId > ( 
           SELECT MIN( d3.RowId )
             FROM table1 d3
            WHERE d3.field1 = tbl.field1
              AND d3.field2 = tbl.field2
              AND d3.field3 = tbl.field3 ... ) 
       AND table1.field1 = tbl.field1 
       AND table1.field2 = tbl.field2
       AND table1.field3 = tbl.field3 ;

END WHILE ;
CLOSE tbl ;

如果 table1 在其中一些字段(field1、field2、field3...)上建立了索引,并且没有在 table1 上声明复杂的“删除时”触发器,那么操作应该执行得非常快。

【讨论】:

以上是关于从 Advantage Database Server 10.1 表中删除重复行的主要内容,如果未能解决你的问题,请参考以下文章

Advantage Database 8.1 SQL IN 子句

在 Delphi 中获取 Advantage Database 查询的进度

JDBC Advantage Database 找不到表(驱动程序冲突?)

在 Visual Studio .net 中连接到 Advantage Database .add

如何防止 Advantage Database 连接超时?

Advantage Database ERD,来自现有数据库。