2016-04-26 59 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本身內部提供的數據庫即。