从 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][Advantage 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 找不到表(驱动程序冲突?)