Selectieren von Datensätzen ohne Verknüpfung

Hallo,

es gibt 2 Tabellen T1 und T2. Zwischen den Datensätzen besteht eine 1 zu n Beziehung.

Also:

Einem Datensatz aus T1 sind keine, einer oder mehrere Datensätze aus T2 zugeordnet

Einem Datensatz aus T2 ist genau ein Datensatz aus T1 zugerodnet.

Leider wurden jetzt einige Datensätze in T1 gelöscht.

Mit welcher select-Anweisung kann ich herausfinden, welche Datensätze in T2 keine Zuordnung mehr zu T1 haben? (für MySQL)

Danke!

Mit welcher select-Anweisung kann ich herausfinden, welche
Datensätze in T2 keine Zuordnung mehr zu T1 haben? (für MySQL)

Hallo Christian!

Unter Oracle würdedas hier funktionieren:

SELECT t2.id FROM t2 WHERE NOT EXISTS (SELECT t1.id FROM t1 WHERE t1.id = t2.id)

oder mit einem outer join (da bin ich Oracle-geschädigt, die korrekte ANSI-Syntax iast mir leider nicht geläufig)

SELECT t1.id, t2.id FROM t1, t2 WHERE t2.id=t1.id(+) AND t1.id IS NULL

Vorsicht: Wenn’s in den Id’s NULLs gibt, dann musst du die Vergleiche entsprechend anpassen.

Ganz nebenbei: Ein gutes DB-Design sollte per Foreign Key(s) sicherstellen, dass in einer solchen typischen Master-Child-Relation der Master-Satz nicht gelöscht werden kann [unter Oracle: ALTER TABLE t2 ADD CONSTRAINT FK_T2_T1 FOREIGN KEY (id) REFERENCES t1 (id)];

Gruss
Martin

Hallo Christian

Mit welcher select-Anweisung kann ich herausfinden, welche
Datensätze in T2 keine Zuordnung mehr zu T1 haben? (für MySQL)

Angenommen, der Primärschlüssel in T1 und Fremdschlüssel in T2 heisst „T1ID“, dann sollte diese SQL-Abfrage das gewünschte Ergebnis bringen (ich kenne MySQL nicht, sollte aber auch dort funktionieren):

SELECT \* FROM T2
WHERE T2.T1ID NOT IN (SELECT T1ID FROM T1);

Gruss
Peter

Lösung
Hi,

Danke für die schnelle Hilfe. Leider haben die Select Anweisungen nicht funktioniert. Hab aber mittlerweile die Lösung gefunden.

SELECT T2.id FROM T2
left join T1 on T1.id = T2.T1_id
where T1.id is null

Hallo Christian

Danke für die schnelle Hilfe.

Gerne.

Leider haben die Select Anweisungen nicht funktioniert.

Das kann ich kaum glauben, da sowohl Martins erster als auch mein Vorschlag lediglich ANSI-SQL verwenden… und das sollte auch MySQL kennen?!

Hab aber mittlerweile die Lösung gefunden.

Na dann ist’s ja gut.

Gruss
Peter

Leider haben die Select Anweisungen nicht funktioniert.

Das kann ich kaum glauben, da sowohl Martins erster als auch
mein Vorschlag lediglich ANSI-SQL verwenden… und das sollte
auch MySQL kennen?!

alle bd. basierten auf subselects, die mysql afair erst ab 4.x kann…

Leider haben die Select Anweisungen nicht funktioniert.

Das kann ich kaum glauben, da sowohl Martins erster als auch
mein Vorschlag lediglich ANSI-SQL verwenden… und das sollte
auch MySQL kennen?!

alle bd. basierten auf subselects, die mysql afair erst ab 4.x
kann…

Da lag dann auch das Problem. Ich verwende MySQL 3.23.58.