如何从没有唯一键的表中删除重复行只有“普通”SQL而没有临时表?

时间:2014-01-20 02:33:01

标签: sql cross-platform relational-database duplicate-removal

这里已经多次提出并回答了类似的问题。根据我的发现,它们要么特定于特定的SQL实现(Oracle,SQL Server等),要么依赖于临时表(最初将复制结果)。

我想知道它们是否是一个独立于平台的纯DML解决方案(只是一个DELETE语句)。

示例数据:表A ,包含单个字段。

---------
|account|
|-------|
| A22   |
| A33   |
| A44   |
| A22   |
| A55   |
| A44   |
---------

以下SQL Fiddle显示了基于ROWID伪列的特定于Oracle的解决方案。它不适用于任何其他数据库,仅作为示例显示。

1 个答案:

答案 0 :(得分:0)

我能想到的唯一与平台无关的方法是将数据存储在辅助表中,截断第一个,然后将其加载回来:

create table _tableA (
    AccountId varchar(255)
);

insert into _TableA
    select distinct AccountId from TableA;

truncate table TableA;

insert into TableA
    select AccountId from _TableA;

drop table _TableA;

如果您有一个每个帐户唯一的列或放宽SQL的方言,那么您可以找到一个查询解决方案。