Entwickler-Ecke

Datenbanken - SQL nur doppelte Einträge anzeigen


derDoc - Mo 07.04.03 07:32
Titel: SQL nur doppelte Einträge anzeigen
Kann mir jemand sagen, wie ich es schaffe, mir nur die doppelten Einträge in meiner Datenbank anzeigen zu lassen?


Andi1982 - Mo 07.04.03 08:11

Hi,
also erstmal was grundsätzliches, es sollte nie vorkommen dass in einer Tabelle doppelte einträge vorhanden sind. Ich bin jetzt mal davon ausgegangen du meinst doppelte einträge in der selben tabelle.

Hab dir mal nen kurzen SQL gebastelt mit dem es gehen müsste!


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
SELECT *                                                       
FROM TABLE1 T1,
         (SELECT COUNT(*) AS ANZAHL                     
          FROM SELBETABELLEWIE1                         
          GROUP BY FELD1, FELD2, FELD3, FELD4, .... ) T2
WHERE                                                          
          T2.ANZAHL = 2                                        
      AND T1.FELD1 = T2.FELD1                                  
      AND T1.FELD2 = T2.FELD2                                  
      AND T1.FELD3 = T2.FELD3                                  
      AND T1.FELD4 = T2.FELD4                                  
      AND T1.FELD5 = T2.FELD5                                  
       ...


In diesem Fall wird der fall der doppelt ist aber auch doppelt ausgegeben. Wenn du dies verhindern willst solltest du hinten noch eine Group By anweisung dranhängen!

Wenn du fragen hast einfach melden!!!

Gruß andi


derDoc - Mo 07.04.03 10:53

Danke Andi.
Ich benötige das, um eine Adresstabelle auf doppelte Einträge zu prüfen, die dort nunmal vorkommen können.
Was meinst du mit noch einer GROUP BY Anweisung?


Andi1982 - Mo 07.04.03 12:11

Hi,
also ich hab das mal ausprobiert, wenn eine Datenbank richtig angelegt ist, also indexfelder richtig vergeben usw. dann wirst du es kaum schaffen doppelte datensaetze zu erzeugen.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
SELECT *                                                       
FROM TABLE1 T1,
         (SELECT COUNT(*) AS ANZAHL                     
          FROM SELBETABELLEWIE1                         
          GROUP BY FELD1, FELD2, FELD3, FELD4, .... ) T2
WHERE                                                          
          T2.ANZAHL = 2                                        
      AND T1.FELD1 = T2.FELD1                                  
      AND T1.FELD2 = T2.FELD2                                  
      AND T1.FELD3 = T2.FELD3                                  
      AND T1.FELD4 = T2.FELD4                                  
      AND T1.FELD5 = T2.FELD5                                  
       ...


Mit diesem SQL bekommst du jede zeile immer doppelt zurueck.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
SELECT *                                                       
FROM TABLE1 T1,
         (SELECT COUNT(*) AS ANZAHL                     
          FROM SELBETABELLEWIE1                         
          GROUP BY FELD1, FELD2, FELD3, FELD4, .... ) T2
WHERE                                                          
          T2.ANZAHL = 2                                        
      AND T1.FELD1 = T2.FELD1                                  
      AND T1.FELD2 = T2.FELD2                                  
      AND T1.FELD3 = T2.FELD3                                  
      AND T1.FELD4 = T2.FELD4                                  
      AND T1.FELD5 = T2.FELD5                                  
       ...                                                     
      GROUP BY FELD1, FELD2, FELD3, FELD4, ....


Hier bekommst du aber nur eine Ergebniszeile zurueck. Hat aber den nachteil dass du nicht erkennst wie oft es nur wirklich vorhanden ist. du koenntest es hoechstens noch so machen


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
SELECT *, T2.Anzahl                                                       
FROM TABLE1 T1,
         (SELECT COUNT(*) AS ANZAHL                     
          FROM SELBETABELLEWIE1                         
          GROUP BY FELD1, FELD2, FELD3, FELD4, .... ) T2
WHERE                                                          
          T2.ANZAHL > 2                                        
      AND T1.FELD1 = T2.FELD1                                  
      AND T1.FELD2 = T2.FELD2                                  
      AND T1.FELD3 = T2.FELD3                                  
      AND T1.FELD4 = T2.FELD4                                  
      AND T1.FELD5 = T2.FELD5                                  
       ...                                                     
      GROUP BY FELD1, FELD2, FELD3, FELD4, ....


So bekommst du nur eine Zeile zurueck und ausserdem noch wie oft der Satz in der Datenbank vorkommt!

Gruß andi


derDoc - Mo 07.04.03 14:22

Nochmal danke Andi, ich werde das mal testen.


Luncustaf - Mo 07.04.03 18:09

nach einem GROUP BY solltest du anstatt WHERE nen HAVING verwenden


gr€€tz


Cashels - Di 08.04.03 18:26

Oder mit einer ganz gewagten Abfrage:

Quelltext
1:
2:
3:
select distinct t1.Feld1, t1.Feld2 from Tabelle1 t1, Tabelle2 t2
where t1.Feld1=t2.Feld1 and t1.Feld2=t2.Feld2 
      and t1.ID <> t2.ID


Dabei geh ich davon aus, daß die Tabelle einen Primäindex ID hat. Die Abfrage liefert nur die Datensätze für welche Feld1 und Feld2 übereinstimmen.

Gruß,
Tom