1.8k Aufrufe
Gefragt in Datenbanken von
Hallo an alle.
ich arbeite mit dem Sql-Server 2000 und 2005. Dort habe ich zwei Tabellen (Tab1 und Tab2) die die gleichen Felder beinhalten (ID, Name, Programm).
Jetzt habe ich eigentlich eine ganz einfache Frage.
Ich brauche ein Select, welches mir alle Datensätze ausgibt, die in der jeweiligen anderen Tabelle nicht vorhanden sind.
z.B.:
Tabelle 1:
ID | Name | No
------------------------------------------
1 | test1 | 1
2 | test2 | 2
2 | test3 | 5

Tabelle 2:
ID | Name | No
------------------------------------------
1 | test1 | 1
2 | test2 | 2
2 | test3 | 4
3 | bla | 2

Gewünschte Aussgabe:

Tab1_ID | Tab1_Name | Tab1_No | Tab2_ID |Tab2_Name |Tab2_No
------------------------------------------------------------------------------------------------
2 | test3 | 5 | null | null | null
null | null | null | 2 | test3 | 4
null | null | null | 3 | bla | 2

Erklärung: in den Tabellen kommen die ersten beiden Datensetzen in beiden vor. Daher werden diese ignoriert. Der dritte Datensatz ist in beiden nicht gleich (unterschiedliche No). Daher werden diese aufgelistet. Der 4te Datensatz aus Tab2 kommt nur in dieser vor. Daher wird auch dieser aufgelistet.

Leider sind die Angaben für “null” auch wichtig um zu sehen, in welcher Tabelle die Werte fehlen!

Also eine Ausgabe was in Tab1 vorkommt und in Tab2 nicht und umgekehrt. Oder anders herum, alle gleichen Datensätze werden ignoriert.

Ich hab langsam nen Knoten im Hirn und komm absolut nicht drauf.
Hoffe es ist verständlich was ich meine :-/

Danke schon mal vorab!

1 Antwort

0 Punkte
Beantwortet von
Hat sich erledigt.
Das Stichwort was mir fehlte war „full outer join“. Ist zwar nicht ganz einfacher Tobak mit den ganzen Joins wie ich finde, aber mit ein paar versuchen hat es dann geklappt!

Damit die Frage nicht ganz unnötig war, hier noch meine Lösung für alle, die es interessiert:

SELECT Tab1.ID AS Tab1_ID,
Tab1.Name AS Tab1_Name,
Tab1.No AS Tab1_No,
Tab2.ID AS Tab2_ID,
Tab2.Name AS Tab2_Name,
Tab2.No AS Tab2_No
FROM Tab1 FULL OUTER JOIN Tab2 ON
Tab1.No = Tab2.No AND
Tab1.Name = Tab2.Name AND
Tab1.ID = Tab2.ID
WHERE Tab1.ID IS NULL or
Tab2.ID IS NULL

Die Where- Klausel dient nur noch dazu auf die „nichtvorhandenen“ Werte aus Tab1 bzw. Tab2 zu filtern.

Trotzdem noch mal Danke an alle!
...