如果没有唯一键,如何删除sybase中的重复行?

maf*_*oft 2 sql sybase sqlanywhere duplicate-removal

是的,你可以多次找到类似的问题,但是:这里发布的最优雅的解决方案适用于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;
Run Code Online (Sandbox Code Playgroud)

小智 5

如果所有字段都相同,您可以这样做:

select distinct * 
into #temp_table
from table_with_duplicates 

delete table_with_duplicates 

insert into table_with_duplicates select * from #temp_table
Run Code Online (Sandbox Code Playgroud)

如果所有字段都不相同,例如,如果您的id不同,那么您需要列出select语句中的所有字段,并在id中对值进行硬编码以使其相同,如果是你不关心的领域.例如:

insert #temp_table field1, field2, id select (field1, field2, 999)
from table_with_duplicates
Run Code Online (Sandbox Code Playgroud)