# Doppelte Datensätze (bestimmte Spalten) aber alle Spalten anzeigen



## TutorialKing (22. Oktober 2008)

Hallo zusammen,

ich arbeite mit Oracle 10.
Ich habe ein Tabelle mit ca. 20 Spalten.

Meine Abfrage bisher :


```
SELECT count(*),iso,name1,name2,nr1,nr2,nr3
from tabelle
GROUP BY iso,name1,name2,nr1,nr2,nr3
HAVING COUNT(*) > 1
```

Diese Abfrage zeigt mir alle doppelten Datensätze in meiner Tabelle an. 


```
count(*),iso,name1,name2,nr1,nr2,nr3
2	439	nameX	nameL
3	260	nameG	nameW
7	439	nameR	nameT
4	447	nameT	nameO
```

Soweit so gut.

Ich möchte aber alle Datensätze angezeigt bekommen. Das heisst die erste Zeile mit den 2 doppelten soll auch doppelt in der Ergebnismenge erscheinen.
Zusätzlich sollen auch alle andere Spalten die in der Tabelle vorkommen name3,name4 etc. angezeigt werden.
Wie könnte man das ganze verknüpfen ? Über die rowid z.b. geht ja leider nicht.


----------



## Andi1982 (22. Oktober 2008)

```
SELECT (select count(*)
             ,iso
             ,name1
             ,name2
             ,nr1
             ,nr2
             ,nr3
          from tabelle
         GROUP BY iso,name1,name2,nr1,nr2,nr3
        HAVING COUNT(*) > 1) cnt
     ,iso
     ,name1
     ,name2
     ,nr1
     ,nr2
     ,nr3
  from tabelle
where (select count(*)
             ,iso
             ,name1
             ,name2
             ,nr1
             ,nr2
             ,nr3
          from tabelle
         GROUP BY iso,name1,name2,nr1,nr2,nr3
        HAVING COUNT(*) > 1) >1
```

Per Subselect?

greez


----------



## TutorialKing (23. Oktober 2008)

Die Idee ist schonmal gut. Leider funktioniert dein Statement nicht. "Too many values"
Und diese Abfrage berücksicht "nur" das alle doppelten Datensätze ausgegeben werden.
Ich möchte aber noch weitere Spalten in der Tabelle mit ausgeben. zusatz3 zusatz4 usw.

So sollte das Ergebnis aussehen :

```
iso,name1,name2,nr1,nr2,nr3,zusatz3,zusatz4
439	nameX	nameL	z01	z31	
439	nameX	nameL	z02	z30
260	nameG	nameW	z01	z30
260	nameG	nameW	z02	z22
260	nameG	nameW	z50	z35
439	nameR	nameT	z01	z31
439	nameR	nameT	z02	z32
439	nameR	nameT	z22	z33
439	nameR	nameT	z12	z34
439	nameR	nameT	zdaten	z35
439	nameR	nameT	zinhalt	z36
439	nameR	nameT	z7	z37
447	nameT	nameO	z89	z38
447	nameT	nameO	hu	z39
447	nameT	nameO	ko	z40
447	nameT	nameO	ok	z29
```


----------



## Andi1982 (23. Oktober 2008)

dann lass im subselect die gruppierung weg und nur den count stehen, zusätzlich join deine tabelle gegen den subselect eins zu eins

greez


----------



## TutorialKing (24. Oktober 2008)

> dann lass im subselect die gruppierung weg und nur den count stehen, zusätzlich join deine tabelle gegen den subselect eins zu eins



Könntest du mir dazu bitte ein Beispiel posten


----------



## Andi1982 (25. Oktober 2008)

```
SELECT t1.iso
     , t1.name1
     , t1.name2
     , t1.nr1
     , t1.nr2
     , t1.nr3
     , sub.cnt
  from tabelle t1
     , (select count(*) cnt
             ,iso
             ,name1
             ,name2
          from tabelle
         GROUP BY iso,name1,name2,nr1,nr2,nr3) sub
 where t1.iso   = sub.iso  
   and t1.name1 = sub.name1
   and t1.name2 = sub.name2
   and sub.cnt > 1;
```
oder hilft dir evtl ein trivialer select *? Du verwirrst mich gerade.

greez


----------



## TutorialKing (28. Oktober 2008)

Danke das hat schon genügt. Es hat funktioniert


----------



## Jusage (27. Juli 2011)

Ich muss das Thema leider nochmal aufleben lassen da ich vor dem gleichen Problem stehe aber auch mit diesem (bis jetzt definitiv Hilfreichstem Thread) nicht wirklich weiter komme... Ich arbeite ebenfalls mit Oracle 10.

Also hier mal mein SQL Select:


```
SELECT  t1.ID, 
        t1.FremdID, 
        t1.AccountID, 
        t1.Wert1, 
        t1.Wert2, 
        t1.Wert3, 
        t1.Wert4, 
        t1.Wert5, 
        t1.Wert6, 
        t1.Wert7, 
        t1.Wert8,
        t1.Wert9,
        sub.cnt1,
        sub.cnt2,
        sub.cnt3,
        sub.cnt4,
        sub.cnt5,
        sub.cnt6,
        sub.cnt7,
        sub.cnt8,
        sub.cnt9,
        sub.cnt10
FROM tabelle t1
        , (SELECT COUNT(AccountID) cnt1, 
                  COUNT(Wert1) cnt2, 
                  COUNT(Wert2) cnt3, 
                  COUNT(Wert3) cnt4, 
                  COUNT(Wert4) cnt5, 
                  COUNT(Wert5) cnt6, 
                  COUNT(Wert6) cnt7, 
                  COUNT(Wert7) cnt8, 
                  COUNT(Wert8) cnt9, 
                  COUNT(Wert9) cnt10
           FROM  tabelle
           GROUP BY AccountID, 
                    Wert1, 
                    Wert2,
                    Wert3,
                    Wert4,
                    Wert5,
                    Wert6,
                    Wert7,
                    Wert8,
                    Wert9) sub
WHERE t1.AccountID = sub.AccountID
  AND t1.Wert1     = sub.Wert1
  AND t1.Wert2     = sub.Wert2
  AND t1.Wert3     = sub.Wert3
  AND t1.Wert4     = sub.Wert4
  AND t1.Wert5     = sub.Wert5
  AND t1.Wert6     = sub.Wert6
  AND t1.Wert7     = sub.Wert7
  AND t1.Wert8     = sub.Wert8
  AND t1.Wert9     = sub.Wert9
  AND sub.cnt1 > 1
  AND sub.cnt2 > 1
  AND sub.cnt3 > 1
  AND sub.cnt4 > 1
  AND sub.cnt5 > 1
  AND sub.cnt6 > 1
  AND sub.cnt7 > 1
  AND sub.cnt8 > 1
  AND sub.cnt9 > 1
  AND sub.cnt10 > 1;
```


So mein Problem ist wie folgt das ich manche Einträge doppelt habe, bis auf gewisse Felder die aufgrund von Autoincrement usw absolut Unique sind. Z.B. die Felder ID und FremdID. Darum dürfen die eben nicht in der GroupBy auftauchen da er sonst sagt es gab keine doppelten... Warum auch immer.

Das obige Beispiel ist das was ich aus dem gebastelt habe was ich hier gefunden habe, leider sagt er mir da folgenden fehler:

*"SUB"."WERT9": invalid identifier*

Vielleicht kannt mir ja jemand von euch helfen wie ich es hinkriege...
Eine Ausgabe derer die Doppelt sind hab ich bereits hingekriegt, jedoch eben Gruppiert, ich bräuchte eine in der die ID und FremdID mit drin stehen damit ich genau weiss welcher Datensatz wirklich doppelt ist.

Hier mal ein beispiel der Tabelle:

```
ID   FremdID     AcountID   Wert1   Wert2   Wert3   Wert4   Wert5 etc
1    100         2201       2000    YES     77      22      1
2    100         2201       2000    YES     77      22      1
3    200         2201       2000    YES     77      22      1
4    100         1507       2000    NO      77      22      2
5    150         2201       2000    YES     77      22      2
```


Hier sollte er mir jetzt wenn es möglich ist einmal die spalte mit der ID 1 und einmal die mit der ID 2 und einmal die mit der ID 3 ausgeben da diese 3 absolut Identisch sind bis auf die ID und FremdID, welche ich zwar unbedingt brauche um zu wissen welche Einträge nun doppelt sind, aber im Count und GroupBy nicht auftauchen dürfen.

Ich danke schonmal für die mühe und hoffe hier kann mir jemand weiterhelfen...


----------



## Jusage (4. August 2011)

Hat niemand hier nen hilfreichen Ansatz was genau ich falsch mache?


----------

