SQL Doppelte Einträge einer Tabelle anzeigen

Hotshady

Lt. Junior Grade
Registriert
Apr. 2010
Beiträge
447
Hallo,

ich versuche mich gerade an einer Abfrage, mit der ich Zeilen aus einer Tabelle auflisten kann, die in einer bestimmten Spalte den gleichen Wert haben.
Mit diesem Statement komme ich nicht allzu weit. Es werden lediglich die Anzahl der doppelten Einträge angezeigt. Also eine Spalte mit bspw. der Zahl 7 bedeutet, dass es ein 7 Datensätze für einen bestimmten Eintrag in der gesuchten Spalte gibt. Ich möchte allerdings die 7 Einträge komplett mit allen anderen Spalten angezeigt bekommen.

SELECT [Spaltenname]
FROM [Tabellenname]
GROUP BY [Spaltenname]
HAVING COUNT (*) > 1

Jemand eine Idee, wie ich das am besten bewerkstelligen kann?
 
Hi,

funktioniert bei mir. Welches SQL benutzt du? MySQL?

Ich möchte allerdings die 7 Einträge komplett mit allen anderen Spalten angezeigt bekommen

Dann musst du natürlich die Spalten selektieren, die du gerne hättest.

VG,
Mad
 
Ich würde es mal mit einer Subquery versuchen, etwa so:

SELECT * FROM [Tabellenname] WHERE [Spaltenname] IN ([deine Query])
 
Hallo,

ich nutze postgresql. Weißt Du, ob es da einen Unterschied bei den Befehlen gibt?
 
Hi,

in MySQL läuft es definitiv. Kannst du dein Query mal konkret exakt so posten wie du es absetzt? Also ohne Platzhalter? Im Grunde sollte das schon auch funktionieren, ich kenne allerdings postgresql nicht.

VG,
Mad
 
Die Tabelle hat 90 Spalten und ich möchte alle haben wo eine Übereinstimmung bspw. in SPalte X besteht (doppelter Eintrag in X). Muss ich da bei GROUP BY jetzt echt alle SPalten aufführen??
 
Ich würd es auch mit der Unterabfrage versuchen

Das WHERE ... IN (SELECT...) funktioniert auf jeden Fall in Postgre

Folgende Seite Postgresqltutorial.com kann ich dir nur wärmstens ans Herz legen ist wirklich gut und hat mir bisher immer geholfen.
 
Hi,

erkläre bitte nochmal: möchtest du JEDE Spalte auf Duplikate prüfen? Oder was genau? Dein Startpost las sich so, dass du EINE Spalte auf Duplikate prüfen willst und am Ende alle Datensätze komplett ausgegeben haben möchtest.

Wenn das so ist musst du nicht im GROUP BY alle aufführen sondern im SELECT, oder eben einfach ein "*".

VG,
Mad
 
Ich schau mir das Tutorial an und probier die Unterabfrage mal aus. Zum Verständnis was das Problem eigentlich ist:

Ich habe eine Tabelle mit 90 Spalten und mehreren tausend Zeilen. In einer dieser Spalten wird ein Wert abgelegt, der in dieser Tabelle nur ein Mal vorkommen darf (also jede Zeile der Tabelle, darf in der gesuchten Spalte keine gleichen Einträge haben --> hat nix mit PK oder FK zu tun). Ich suche nun nach einer Möglichkeit um

a) zu prüfen, wo es in der gesuchten Spalte Einträge mit dem identischen Inhalt gibt und
b) möchte mir dann den kompletten Inhalt (also Zeilen mit allen Spalten) zu diesen doppelten Einträgen aufzeigen lassen.
 
Zuletzt bearbeitet:
Hi,

ok, doch richtig verstanden :)

Also in MySQL ist der Befehl der, den du benutzt hast.

SELECT *
FROM `table`
group by `spalte`
HAVING COUNT(*) > 1

So kriege ich die kompletten Datensätze, in denen in Spalte "spalte" ein Wert mehrfach vorkommt. postgresql scheint da anders zu arbeiten wenn das nicht funktioniert.

VG,
Mad
 
@Mad bei deiner Notation bekommen ich sowohl in SQL als auch in Postgre Fehler

So sollte es gehen aber gehen:

SELECT *
FROM DeineDB
WHERE (SELECT COUNT(B.SpaltemitdoppeltenWerten) FROM DeineDB AS B WHERE B.SpaltemitdoppeltenWerten= SpaltemitdoppeltenWerten) > 1
ORDER BY SpaltemitdoppeltenWerten
 
Zuletzt bearbeitet:
Hi,

bei mir funktioniert exakt diese Abfrage, so wie ich sie oben geschrieben habe, im MySQL Query Browser. Sehr strange.

VG,
Mad
 
Hotshady schrieb:
Ich habe eine Tabelle mit 90 Spalten und mehreren tausend Zeilen. In einer dieser Spalten wird ein Wert abgelegt, der in dieser Tabelle nur ein Mal vorkommen darf (also jede Zeile der Tabelle, darf in der gesuchten Spalte keine gleichen Einträge haben --> hat nix mit PK oder FK zu tun).
PK und FK mögen hier nicht relevant sein, aber ein Index ist trotzdem die Lösung, genauer gesagt ein Unique Key (bzw. Unique Constrain).
 
Moin, ich nochmal. Ich bräuchte nochmal kurz Hilfe zu der Abfrage:

SELECT *
FROM MeineTabelle AS A
WHERE A.Feld_Kunde= 'Kunde' AND A.Spalte_mit_doppelten_Werten IS NOT NULL AND
(SELECT COUNT(B.Spalte_mit_doppelten_Werten) FROM MeineTabelle AS B WHERE B.Spalte_mit_doppelten_Werten= Spalte_mit_doppelten_Werten) > 1
ORDER BY Spalte_mit_doppelten_Werten
LIMIT 100

Ich bekomme in der Spalte_mit_doppelten_Werten trotz der Anweisung "IS NOT NULL" als Ergebnis der Abfrage leere Felder in der Spalte ausgegeben. Was mache ich falsch?!

Edit: Ich hab das Limit mal auf 10000 gesetzt und es sind immer noch alle Felder in Spalte_mit_doppelten_Werten leer. Hängt das vielleicht mit der bfrage ansich zusammen?
 
Zuletzt bearbeitet:
Kann es sein, dass in den "leeren Feldern" einfach ein leerer String anstatt NULL drin steht? Das müsstest du dann auch abfangen.
 
raekaos schrieb:
@Mad bei deiner Notation bekommen ich sowohl in SQL als auch in Postgre Fehler

So sollte es gehen aber gehen:

SELECT *
FROM DeineDB
WHERE (SELECT COUNT(B.SpaltemitdoppeltenWerten) FROM DeineDB AS B WHERE B.SpaltemitdoppeltenWerten= SpaltemitdoppeltenWerten) > 1
ORDER BY SpaltemitdoppeltenWerten

Hallo, auch wenn dieser Thread sehr alt ist, eine Frage:
Ich bekomme dein Skript zum Laufen, aber mir fehlt etwas.

Aufgabe:
Es gibt in der Tabelle Kontakt ca. 500 Datensätze.
Primary Key = Kontakt_Nummer zB M4711
Weitere Felder: Strasse, PLZ, Ort

Ich soll eine Liste machen, die so aussieht:

M4711 Musterstrasse 123 78400 Konstanz M0815 Musterstrasse 123 78400 Konstanz
M0815 Musterstrasse 123 78400 Konstanz M4711 Musterstrasse 123 78400 Konstanz

=> d.h. alle Datensätze liefern mit jeweils Primary Key, bei denen die Felder Strasse, PLZ, Ort exakt übereinstimmen. Dann wird ein Sachbearbeiter anhand dieser Liste die Doubletten manuell prüfen.

Daher frage ich mich, wie ich B.SpaltemitdoppeltenWerten erweitere auf B. mehrere Spalten mit doppelten Werten?

Evtl. so: B.SpaltemitdoppeltenWerten_1 AND B.SpaltemitdoppeltenWerten_2 AND B.SpaltemitdoppeltenWerten_3 AND B.SpaltemitdoppeltenWerten_4 etc......
 
Zurück
Oben