sql - 当您没有唯一键时,如何删除sybase中的重复行?

标签 sql sybase duplicate-removal sqlanywhere

是的,您可以找到很多类似的问题,但是:
这里发布的最精美的解决方案适用于SQL Server,但不适用于Sybase(在我的情况下为Sybase Anywhere 11)。我什至发现一些与Sybase相关的问题被标记为SQL Server问题的重复项,这无济于事。

我喜欢但不起作用的解决方案的一个示例是WITH ... DELETE ...构造。

我已经找到了使用游标或while循环的有效解决方案,但我希望没有循环也可以。

我希望有一个不错的,简单且快速的查询,只是删除除一个重复项外的所有重复项。

这里有一些测试框架:

IF OBJECT_ID( 'tempdb..#TestTable' ) IS NOT NULL
  DROP TABLE #TestTable;

CREATE TABLE #TestTable (Column1 varchar(1), Column2 int);

INSERT INTO #TestTable VALUES ('A', 1);
INSERT INTO #TestTable VALUES ('A', 1); -- duplicate
INSERT INTO #TestTable VALUES ('A', 1); -- duplicate
INSERT INTO #TestTable VALUES ('A', 2);
INSERT INTO #TestTable VALUES ('B', 1);
INSERT INTO #TestTable VALUES ('B', 2);
INSERT INTO #TestTable VALUES ('B', 2); -- duplicate
INSERT INTO #TestTable VALUES ('C', 1);
INSERT INTO #TestTable VALUES ('C', 2);

SELECT * FROM #TestTable ORDER BY Column1,Column2;

DELETE <your solution here>

SELECT * FROM #TestTable ORDER BY Column1,Column2;

最佳答案

如果所有字段都相同,则可以执行以下操作:

select distinct * 
into #temp_table
from table_with_duplicates 

delete table_with_duplicates 

insert into table_with_duplicates select * from #temp_table


如果所有字段都不相同(例如,如果您具有不同的ID),则需要列出select语句中的所有字段,并在ID中硬编码一个值以使其相同(如果是)一个您不关心的领域。
例如:

insert #temp_table field1, field2, id select (field1, field2, 999)
from table_with_duplicates

关于sql - 当您没有唯一键时,如何删除sybase中的重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19544489/

相关文章:

performance - Sybase - 索引现有表时的性能注意事项

sql - 从大表中删除重复行

mysql - 删除重复的行只留下最旧的行?

mysql - 比较数据库中的行并选择值是否大于 15%

c# - 使用 SQL DataReader 捕获插入或删除的值

javascript - 按不同数组中设置的属性类型分隔项目

mysql - Sybase 到 MySQL 自动导出

tsql - 重复删除

javascript - JS - jQuery 动态添加和删除字段

mysql - 从第二个表中获取 3 列和多条记录的总和