Alle Datensätze zweier Tabellen vergleichen

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, No).

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!

Ich brauche ein Select, welches mir alle Datensätze ausgibt,
die in der jeweiligen anderen Tabelle nicht vorhanden sind.

Hi Markus,
das Ganze schreit für mich nach einem ‚full outer join‘ (siehe http://de.wikipedia.org/wiki/Relationale_Algebra). Ich hoffe, deine DB unterstützt so etwas.

gruss
bernhard

Hallo Bernhard,
vielen Dank!
Das war das Stichwort was mir fehlte. Ist zwar nicht ganz einfacher Tobak mit den ganzen Joins wie ich finde, aber mit ein paar versuchen hat es dann geklappt!

Für alle die es interessiert wie:

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.

Noch mal Danke!

Moin, markusdoe,

 Select "Tab1" as "nur in", ID, Name, No from Tab1
 where ID & Name & No not in
 (select ID & Name & No from Tab2)
 Union
 Select "Tab2" as "nur in", ID, Name, No from Tab2
 where ID & Name & No not in
 (select ID & Name & No from Tab1)

Gruß Ralf