【问题标题】:Removing Duplicate Rows From Advantage Database Server 10.1 Table从 Advantage Database Server 10.1 表中删除重复行
【发布时间】: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 语法。 :-) 您可以发布一些示例数据(基于您需要实际匹配的列)吗?此外,在尝试插入之前,请努力选择能够选择行。当你得到它的工作时,然后弄清楚如何将它们插入到另一个表中。

标签: sql dbf advantage-database-server


【解决方案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 上声明复杂的“删除时”触发器,那么操作应该执行得非常快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 2013-02-13
      • 2020-07-07
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-21
      相关资源
      最近更新 更多