SQL Auffinder doppelter Datensätze

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Hallo zusammen,

ich verzweifle gerade an der Erstellung einer SQL-Anweisung.

Mit folgendem String werden mir alle Mitarbeiter angezeigt, die deren Vor-,
Nachname und eMail-Adresse mindestens zweifach im System hinterlegt sind.

Jetzt versuche ich den String ein wenig zu erweitern, um folgendes zu erreichen:
a) Wenn Mitarbeiter mehrfach vorhanden sind, sollen diese auch angezeigt
werden (nicht nur jeder Mitarbeiter einmalig)
b) Ich möchte nur Datensätze prüfen, bei denen die nl den Wert 'N' hat.

Kann mir einer helfen?

Code:
SELECT mitarbeiter.id, mitarbeiter.nl, mitarbeiter.plz, mitarbeiter.ort, mitarbeiter.email, mitarbeiter.vorname, mitarbeiter.nachname, mitarbeiter.geburtstag, mitarbeiter.position, mitarbeiter.history, mitarbeiter.mobil FROM mitarbeiter As mitarbeiter GROUP BY mitarbeiter.email, mitarbeiter.nachname, mitarbeiter.vorname HAVING COUNT(*) > 1

VG, David
 
Wenn mich nicht alles täuscht, sollte ein (INNER) JOIN auf die Mitarbeiter-Tabelle reichen. Als join-Bedingung deine Doppelt-Kriterien. Damit solltest du alle mehrfachen Einträge kriegen.
 
Das hat jetzt schon mal funktioniert und sieht so aus:

Code:
SELECT mitarbeiter.id, mitarbeiter.nl, mitarbeiter.plz, mitarbeiter.ort, mitarbeiter.email, mitarbeiter.vorname, mitarbeiter.nachname, mitarbeiter.geburtstag, mitarbeiter.position, mitarbeiter.history, mitarbeiter.mobil FROM mitarbeiter INNER JOIN (SELECT email FROM mitarbeiter GROUP BY email, nachname, vorname HAVING count(email) > 1) dupes ON mitarbeiter.email = dupes.email ORDER BY mitarbeiter.email

Vielen Dank!

Wo kann ich in dem String denn jetzt einbauen, dass im allgemeinen nur die angezeigt und auch geprüft werden sollen, die bei mitarbeiter.nl den Wert 'N' haben?
 
Z.B. mit:

Code:
nl LIKE 'N'

oder

Code:
WHERE nl = 'N'
 
Zuletzt bearbeitet:
Mach einfach ne neue Tabelle:

INSERT INTO TEMPTABLE
(NL)
SELECT column_name(s)
FROM MITARBEITER WHERE NL LIKE '%N%'
 
Kannst du nicht eben die Relationen auflisten und naehere Informationen dazu geben?

Wenn ich einen Mitarbeiter habe Mitarbeiter(ID, Vorname, Nachname, E-Mail, <weitereAttribute>), dann unterscheiden die sich einzig und allein an der ID. Somit ist dein GROUP BY ein guter Ansatz. Jetzt wuerde ich auf z.B. die kleinste ID zugreifen, mit MIN(ID), damit bekommst du nur die eine ID, die du behalten willst. Fuehre einen Du hast nun eine Menge mit allen IDs die du behalten willst. Nun stelltst du diese Menge in den WHERE TEIL einer Anfrage und willst alle IDs in deiner Menge nun haben die NICHT IN der vorhin ausgerechneten Menge sind.

Code:
SELECT *
FROM Mitarbeiter a
WHERE a.ID NOT IN (
    SELECT MIN(ID)
    FROM Mitarbeiter b
    GROUP BY
        b.Vorname,
        b.Nachname,
        b.E-Mail,
        <eventuell weitere Attribute, wobei email sollte i.d.R. eindeutig sein>
)

Auf diese Menge fuehrst du nun deine aenderungsoperation aus und bist fertig.
 
Zuletzt bearbeitet: (Falsches Wort gewaehlt)
Ich bin zwar nicht mehr so auf dem laufenden bei MySQL aber im DB2 kannst du nur selektieren, was du auch gruppierst.
Wenn du also einen Group über Vorname, Nachname und E-Mail machst, darfst du auch nur diese Anwenden und sonst nur Aggregatsfunktionen wie MIN/MAX/COUNT(*) etc. Mit Having Filterst COUNT(*)>1 sorgst du dann dafür, dass nur jene aufgelistet werden, die mehr als einen Eintrag haben.

Code:
SELECT MIN(mitarbeiter.id), MAX(mitarbeiter.id), mitarbeiter.email, mitarbeiter.vorname, mitarbeiter.nachname
FROM mitarbeiter AS mitarbeiter
GROUP BY mitarbeiter.email, mitarbeiter.vorname, mitarbeiter.nachname
HAVING COUNT(mitarbeiter.id)>1;

Keine Garantie für syntaktische Korrektheit. Ich tippe, dass MySQL das ebenso, wie die großen kann.
 
Wow, die letzten 3 Antworten haben nichts mit der Frage zu tun und kommen ewig nachdem das Problem bereits gelöst ist.
Möchte sonst noch jemand?
 
edith: bitte löschen.
 
Zuletzt bearbeitet: (Möchte doch nicht so tief sinken :).)
Zurück
Oben