2014-10-30 24 views
-2

我需要從前三列組成主鍵的表中找到重複的行。然後在找出哪一個重複之後,需要從查詢結果中刪除那些重複的行,如下例所示: 給定此表。前3列充當主鍵。如何使用複合主鍵消除表中重複的行ORACLE

-------------- 1 2 3 4 5 6 -------------------------- -------------------------------------------------- -------------------------------------------------- -1 2 3 9 8 9 ------------------------------------------- -------------------------------------------------- ---------------------------------- 1 4 3 9 8 9 ---------- -------------------------------------------------- -------------------------------------------------- ----------------- 3 4 2 2 2 1 --------------------------- -------------------------------------------------- -------------------------------------------------- 2 3 4 1 1 3 -------------------------------------------- -------------------------------------------------- --------------------------------- 2 3 4 9 9 0 --------

由於1 2 3是複合pri瑪麗鑰匙。前兩行應該被認爲是重複的,因此從結果中消除。就像兩個2 3 4行一樣。 結果集中唯一的行應該是:

能否請你幫忙嗎?

非常感謝您提前致謝。

+0

如果將列聲明爲組合主鍵,則Oracle不允許插入重複項。 – 2014-10-30 14:49:59

+0

我猜OP想要創造一個複合主鍵,但不能因爲重複 – 2014-10-30 15:11:22

+0

你是對的,它沒有被聲明爲複合主鍵..我們只是使用它「如果」它是..但它不是聲明。 – TechAider 2014-10-30 15:16:41

回答

0

您的問題沒有完全合理。複合主鍵將防止表中的重複。因此,如果數據包含重複項,則這些列是而不是聲明爲合成主鍵。

如果你只是一個一排爲一組,你可以使用row_number()對於這一點,這樣的事情(列名顯然是無效的):

select t.* 
from (select t.*, row_number() over (partition by 1, 2, 3 order by 1) as seqnum 
     from table t 
    ) t 
where seqnum = 1; 

如果你想刪除多餘的行,你可以嘗試:

delete from t 
    where rowid not in (select min(rowid) from table t group by 1, 2, 3); 

編輯:

如果要刪除其中的行重複的情況下,那麼你要count()而不是row_number()

select t.* 
from (select t.*, count() over (partition by 1, 2, 3) as cnt 
     from table t 
    ) t 
where cnt > 1; 
+0

好的,這不是主鍵..對於混淆抱歉..他們是「用」作爲行的非正式標識..但他們不是主鍵。其餘的是一樣的 – TechAider 2014-10-30 15:13:32

+0

我不想每組1行。需要將第1,2和3列上具有重複和匹配值的每一行從查詢結果中取出。另外,我不需要從表中刪除行,只需從查詢中的結果中刪除。 – TechAider 2014-10-30 15:15:33