如何只删除多余的数据?

How to delete only the reduntant data?

如果我有 table 这样的:

ID      FROM_DATE           TO_DATE
18177   2016-04-20 00:00    2016-04-20 00:00
18177   2016-04-20 00:00    2016-04-20 00:00
18177   2016-04-23 00:00    2016-04-23 00:00
18177   2016-04-23 00:00    2016-04-23 00:00
18177   2016-04-24 00:00    2016-04-24 00:00
18177   2016-04-24 00:00    2016-04-24 00:00
18177   2016-04-26 00:00    2016-04-26 00:00
18177   2016-04-26 00:00    2016-04-26 00:00
18177   2016-04-27 00:00    2016-04-27 00:00
18177   2016-04-27 00:00    2016-04-27 00:00
18177   2016-04-30 00:00    2016-04-30 00:00
18177   2016-04-30 00:00    2016-04-30 00:00

这个table没有key,我发现自己需要设置三列组成的主键,但是因为数据重复我做不到。

如何删除多余的数据?比如我有两条数据相同的记录,我想只保留一条记录?

我想要这样的结果来解决问题并设置密钥:

ID      FROM_DATE           TO_DATE
18177   2016-04-20 00:00    2016-04-20 00:00
18177   2016-04-23 00:00    2016-04-23 00:00
18177   2016-04-24 00:00    2016-04-24 00:00
18177   2016-04-26 00:00    2016-04-26 00:00
18177   2016-04-27 00:00    2016-04-27 00:00
18177   2016-04-30 00:00    2016-04-30 00:00

这个有用吗?

delete from t
    where rowid not in (select min(rowid)
                        from t
                        group by id, from_date, to_date
                       );

默认情况下,Informix table 有一个内置的 rowid 列。如果此版本有效,您可以将子查询放入临时 table 并使用它。

另请注意:这样做通常更快:

select distinct id, from_date, to_date
from t
into temp temp_t;

truncate table t;

commit;  -- If there was a transaction active

insert into t(id, from_date, to_date)
    select id, from_date, to_date
    from temp_t;

考虑到大量删除的日志记录和锁定注意事项,这可能会更快。

DELETE FROM Table_Name
WHERE ROWID NOT IN (SELECT MAX(ROWID) FROM Table_Name
                    GROUP BY Id,From_Date,To_Date
                   );

首先它将执行内部查询,它会根据 Id、From_Date 和 To_Date 组合创建不同的组。这样,所有重复记录只属于同一组,然后通过仅选择每个组中的最大 rowid 来过滤不同的记录。然后外部查询将执行并删除重复记录。

ROWID 对于插入数据库的每条记录都是唯一的,即由 DBMS 本身在内部提供。