2012-05-10 69 views
3

可能重複:
Oracle Delete Rows Matching On Multiple Values如何從Oracle數據庫中刪除重複的行?

我們已經意外意味着大多數(但不是全部)行有插入有相同的數據兩次表在表中出現兩次。簡而言之,我想要一條SQL語句來刪除一行的一個版本,同時保留另一個版本;我不介意刪除哪個版本,因爲它們是相同的。

表結構是這樣的:

FID,UNIQUE_ID,COL3,COL4 ....

Unique_ID是主鍵,這意味着每一個僅出現一次。 FID是每個功能獨有的關鍵,所以如果它出現多次,那麼重複應該被刪除。

要選擇有重複的特點是:

select count(*) from TABLE GROUP by FID

不幸的是我無法弄清楚如何從去一個SQL語句刪除,將刪除多餘的行只留下每個之一。

此類問題已被問及之前,我已嘗試創建與獨特的表,但我如何獲得所有列沒有命名它們?這隻能得到單柱FID和(見下)中的所有列,以保持給出了一個:ORA-00936: missing expression

CREATE TABLE secondtable NOLOGGING as select distinct FID from TABLE

+0

當你得到解決方案後,我認真地推薦你將你的數據庫歸一化,因爲重複記錄(所謂的冗餘)很可能是非歸一化數據庫的結果。 – Kushal

+0

@Kush - 我們無法規範化數據庫,因爲許多不同的應用程序都使用它。這是有人在2007年兩次加載數據的結果,但我們沒有使用過這麼多,所以沒有注意到。感謝您的建議,儘管 –

回答

6

如果你不關心哪個行被保留

DELETE FROM your_table_name a 
WHERE EXISTS(SELECT 1 
       FROM your_table_name b 
       WHERE a.fid = b.fid 
        AND a.unique_id < b.unique_id) 

完成後,您需要向該表添加一個約束,以確保FID是唯一的。

1

一個建議

DELETE FROM x WHERE ROWID IN 
(WITH y AS (SELECT xCOL, MIN(ROWID) FROM x GROUP BY xCOL HAVING COUNT(xCOL) > 1) 
SELCT a.ROWID FROM x, y WHERE x.XCOL=y.XCOL and x.ROWIDy.ROWID) 
3

試試這個

DELETE FROM table_name A WHERE ROWID > (
SELECT min(rowid) FROM table_name B 
WHERE A.FID = B.FID) 
+0

理論上這與Justin Cave的一樣,但是你沒有工作,因爲它給了我一個數據類型的錯誤(儘管我的'rowid'是一個整數)。 –

0

與此嘗試。

DELETE FROM firsttable WHERE unique_ID NOT IN 
(SELECT MAX(unique_ID) FROM firsttable GROUP BY FID) 

編輯: 一種解釋:

SELECT MAX(unique_ID) FROM firsttable GROUP BY FID; 

這條SQL語句會挑選每個最大UNIQUE_ID列從每個重複的行組。刪除語句將保留這些最大unique_ID行並刪除每個重複組的其他行。

0

你可以試試這個。

delete from tablename a 
where a.logid, a.pointid, a.routeid) in (select logid, pointid, routeid from tablename 
group by logid, pointid, routeid having count(*) > 1) 
and rowid not in (select min(rowid) from tablename 
group by logid, pointid, routeid having count(*) > 1) 
+0

對於你的代碼的作用,簡單的解釋被認爲是很好的禮儀。 – Neil

相關問題