2013-08-29 25 views
6

Ben Find duplicate entries in a column ve Oracle: find duplicate rows in select query aradık, ancak herhangi bir cevap almak için görünmüyor ...bir sütunda yinelenen öğeleri bulmak Oracle SQL

Ben bu

columnA columnB columnC 
1111111 emailID1 true 
1111111 emailID2 false 
1111222 emailID3 true 
1111339 emailID4 true 
2384398 emailID5 true 

benziyor bazı veriler sadece kolumna aynı değerlere sahip olan bu sütunu görüntülemek istediğiniz ama columnB ve/veya C farklı olabilir:> 1 olması gerçekten captu görünmüyor kullanma

columnA columnB columnC 
1111111 emailID1 true 
1111111 emailID2 false 

Bu, herhangi bir fikir? Teşekkürler. having count(*) > 1 kullanma

+0

Bu arada, sadece bir masada bu araştırıyorum, katılmaya gerek yok. :) –

+0

, sunulan çözümlerin bir kısmının bir * self join * içermesidir, bu yüzden birleştirme * probleminize geçerli bir çözümdür. –

cevap

0
SELECT T.columnA, S.columnB, S.columnC FROM 
(
SELECT columnA FROM someTable 
GROUP BY columnA 
HAVING COUNT(*) > 1 
) T INNER JOIN someTable S ON T.columnA = S.columnA 
7

bulmacanın sadece bir yarısıdır. Diğer yarısı karşılık gelen satırları alıyor.

Böyle yapabilirsiniz:

SELECT * 
FROM MyTable 
WHERE ColumnA IN (
    SELECT ColumnA FROM MyTable GROUP BY ColumnA HAVING COUNT(*) > 1 
) 
+0

+1, ancak bunu alt-seçiminize katılabilirsiniz. – Bohemian

0

Bu kullanarak analitik fonksiyonlar yapabilirsiniz. min ve max bulun ve farklı satırları döndürmek:

select columnA, columnB, columnC 
from (select t.*, min(t.columnC) over (partition by columnA, columnB) as minC, 
      max(t.columnC) over (partition by columnA, columnB) as maxC 
     from t 
    ) t 
where minC <> maxC; 
5

bu deneyin:

SELECT t.* 
FROM (SELECT ColumnA FROM MyTable GROUP BY ColumnA HAVING COUNT(*) > 1) dups 
JOIN MyTable t ON t.ColumnA = dups.ColumnA 

Bu ColumnA üzerinde sürece bir dizin olduğu gibi çok ölçeklendirilebileceği:

create index MyTable_ColumnA on MyTable(ColumnA); 

Böyle bir indeks, hem ana sorgu hem de iç sorgu için çok iyi bir performans sunacaktır.

+1

+1 “IN” görünümünü biraz daha iyi görsem de,% 100'ü “JOIN” in size optimize ediciye daha az bağımlı olduğunu kabul ediyorum. – dasblinkenlight

+0

Maalesef 2 tabloya katılmıyorum ... –

+1

Tabii ki - bu durumda öneri bir tabloyu kendi başına birleştirmektir. İç sorgu yinelenen satırları tanımlar, dış sorgu sonuçta istediğiniz diğer sütunları toplar. –

1

Ben genellikle bir kez sorguda birden tablo daha çarpmamak ister - masanın üzerinde sadece bir tarama yapıyor - bu bile bir dizin olmadan iyi çalışır: it

SELECT columnA, columnB, columnC 
FROM (SELECT mytable.* 
      ,COUNT(*) OVER (PARTITION BY columnA) countA 
     FROM mytable) 
WHERE countA > 1 
0

Bu iplik eski olabilir ama Yinelenen kayıtları bulmak için herkese daha iyi/verimli bir çözüm sunmaya değer. Eşleşen sütunlarda yinelenen kayıtları bulmak için bölüm kullanabilirsiniz (iç birleştirmeyi kullanmadan gereken sayıda sütun).

SELECT * 
FROM (
     SELECT t.*, ROW_NUMBER() OVER (PARTITION BY column1, column2 ORDER BY your_key_column) AS duplicate_count 
     FROM yourtable t 
     ) 
WHERE duplicate_count > 1 --get duplicate records for the matching value in column1 and column2 

here de @Quassnoi orijinal yanıta bakın. Onun için teşekkürler, bölümleme kullanarak çok akıllı bir çözüm.

0

sonra bir sütunda birden fazla anahtar ortaya çıkabilir veritabanınızda benzersiz kimlik yıllardan, içeren girişleri arıyorsanız aşağıda exlplained gibi onları iki tablo oluşturmaktır bulma basit bir şekilde:

İşte

: TICKETID birincil olduğunu anahtar, TKTNUMBER, birden çok kez oluşabilir.içinde

CREATE TABLE TEMP 
(
    TICKETID FLOAT, 
    TKTNUMBER FLOAT 
); 

CREATE TABLE TEMP2 
(
    TKTNUMBER FLOAT, 
    COUNTER  INTEGER 
); 

koyun tüm TICKETID en ve TKTNUMBER en COUNT ile TKTNUMBERS sadece bakarak (TKTNUMBER)> 1: Son olarak

INSERT INTO TEMP 
    SELECT 
     TICKETID, 
     TKTNUMBER 
    FROM YOUR_TABLE 
    WHERE TKTNUMBER IN ( 
      SELECT TKTNUMBER 
      FROM YOUR_TABLE 
      HAVING COUNT (TKTNUMBER) > 1 
      GROUP BY TKTNUMBER); 

, TKTNUMBER koymak sayacı, görmek ve aynı COUNT yukarıdaki gibi yol:

INSERT INTO TEMP2 
    SELECT 
     TKTNUMBER, 
     COUNT (TKTNUMBER) AS COUNTER 
    FROM YOUR_TABLE 
    HAVING COUNT (TKTNUMBER) > 1 
    GROUP BY TKTNUMBER 
    ORDER BY 2 DESC 
(tktnumber üzerinde iki tablo katılarak) aşağıdaki gibi seçebilirsiniz

:

SELECT 
    T1.TICKETID, 
    T1.TKTNUMBER, 
    T2.COUNTER 
FROM 
    TEMP T1 INNER JOIN 
    TEMP2 T2 ON 
     T2.TKTNUMBER = T1.TKTNUMBER 
ORDER BY T2.COUNTER DESC