如何只删除多余的数据?
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 本身在内部提供。
如果我有 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 本身在内部提供。