2016-04-26 55 views
1

如果我有表是这样的:如何只删除还原剂数据?

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 

这个表有没有钥匙,我发现我自己需要设置三列组成的主键,但我不能这样做,因为数据重复。

如何删除冗余数据?例如,如果我有两个具有相同数据的记录,我只想保留一条记录?

我想这样的结果来解决这个问题,设置键值:

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 
+3

副本创建表,插入复制从originaltable选择不同*。重命名 – jarlh

+0

@jarlh:我编辑的问题 –

+0

对此有读:http://stackoverflow.com/questions/18932/how-can-i-remove-duplicate-rows?rq=1 – StevieG

回答

3

工作的呢?

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

默认情况下,Informix表具有内置的rowid列。如果这个版本能够工作,你可以把子查询放到一个临时表中并使用它。

还要注意:它往往是更快地做这种方式:

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; 

这可能是因为日志和进行大规模删除锁定的考虑更快。

+0

我尽量选择像先此: 'SELECT * FROM吨 其中ROWID未在( 从吨 组由ID,FROM_DATE,TO_DATE SELECT MIN(ROWID));' 当我使用独特我得到更少的行!! 我有更多的列BTW –

+0

@ anyname-donotcare和这些其他列有各行的值不同?对于同一个“id”,“from_date”和“to_date”,其他列可能在不同行之间有所不同?如果是这样,你将如何选择保留哪一行? –

+0

@ anyname-donotcare你能发布:问题的表的完整的模式; 'SELECT COUNT(*)FROM t'的结果; 'SELECT COUNT(*)FROM t GROUP BY id,from_date,to_date'的结果; 'SELECT COUNT(*)FROM(SELECT UNIQUE * FROM t)'的结果。 –

1
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本身内部提供的数据库即。