2013-07-24 53 views
1

什麼是在Oracle中顯示重複行的理想方式?這裏的訣竅是我正在尋找所有行,不僅僅是倍數(重複)。因此,例如在下面的數據集:Oracle重複行檢測

RSN fname lname emailaddress 
1 John Smith [email protected] 
2 John Smith [email protected] 
3 John Smith [email protected] 
4 Kevin Walker [email protected] 
5 James Kirk [email protected] 
6 James Kirk [email protected] 
7 Kevin James [email protected] 
8 Mike Jones [email protected] 

我想下面返回:

1 John Smith [email protected] 
2 John Smith [email protected] 
3 John Smith [email protected] 
5 James Kirk [email protected] 
6 James Kirk [email protected] 

任何幫助嗎?

+0

這裏,讓我[搜索](http://stackoverflow.com/search?q= [甲骨文] +複製+行)爲您 – tbone

+0

我找遍廣泛,但是,我發現結果只返回重複的,即給定條件的第二個或更高實例的行。但感謝您的意見。 – b1shp

回答

1

這裏有一種方法:

SELECT RSN, fname, lname, emailaddress 
    FROM whatever_your_table_is_named t1 
WHERE (SELECT COUNT(1) 
      FROM whatever_your_table_is_named t2 
      WHERE t2.fname = t1.fname 
      AND t2.lname = t1.lname 
      AND t2.emailaddress = t1.emailaddress 
      AND ROWNUM < 3 
     ) > 1 
; 

下面是另一個:

SELECT t1.RSN, t1.fname, t1.lname, t1.emailaddress 
    FROM whatever_your_table_is_named t1 
    JOIN (SELECT fname, lname, emailaddress 
      FROM whatever_your_table_is_named 
      GROUP 
      BY fname, lname, emailaddress 
     HAVING COUNT(1) > 1 
     ) t2 
    ON t1.fname = t2.fname 
    AND t1.lname = t2.lname 
    AND t1.emailaddress = t2.emailaddress 
; 

(聲明:我沒有測試過這些要麼)

+0

謝謝,我不知道它有多優化,因爲顯然我的Oracle技能不是很好,但它確實有效。謝謝你! – b1shp

+0

這算(1)是醜陋的。這是非標準的,並不比計數(*)好。有關其性能優越的傳聞只是神話。 –

+0

那麼任何改進都非常受歡迎。我將通過超過一百萬條記錄來運行此操作。 – b1shp

0

這個子查詢會得到重複的形成表。

select * 
    from (some table) 
    where rsn IN (select rsn 
        from (some table) 
        where fname IN 
        (select fname 
        from (select fname, count(fname) as dup 
      from (some table)) where dup > 1)