SQL Outer join

Alkor35

Ensign
Registriert
Aug. 2004
Beiträge
133
Hi Leute,

wie folgt sehen die Tabellen aus:

Tabelle A
ID Name Name2
1 Karl Heinz
2 Lisa Simpson ´

Tabelle B
ID Nummer Daten
1 1 Bauarbeiter
1 2 Rot
1 3 Ford K
2 1 Schüler
2 2 Blau

Meine Anweisung lautet

Select A.Name, A.Name2, B.Daten As Beruf, B.Daten As Lieblingsfarbe, B.Daten As Auto
From A LEFT OUTER JOIN
B on A.ID = B.ID LEFT OUTER JOIN
B As B1 on A.ID = B1.ID LEFT OUTER JOIN
B As B2 on A.ID = B2.ID
Where (B.Nummer = '1' AND B1.Nummer = '2' AND B2.Nummer = '3')


Bei dieser Abfrage bekomme ich jedoch zu wenig Datensätze zurück.
Was habe ich hier falsch gemacht?

Ziel ist folgende Ausgabe
Name Name2 Beruf Lieblingsfarbe Auto
Karl Heinz Bauarbeiter Rot Ford K
Lisa Simpson Schüler Blau
 
Zuletzt bearbeitet:
Tabelle B scheint mir auch etwas seltsam aufgebaut.
Eine ID vergibt man einmalig und nicht öfters.
Zudem würde ich aus Normalisierungsgründen nicht das Feld "Daten" für mehrere Sachen missbrauchen.
Würde Tabelle B so aufbauen:

ID/ FK_Person / Beruf / Lieblingsfarbe / Auto
1, 1, Bauarbeiter, Rot, Ford K
2, 2, Schüler, Blau

Wobei FK_Person ein Foreign Key sein sollte, der auf die ID in Tabelle A zeigt.

und dann wäre die anweisung:
Select A.Name, A.Name2, B.Beruf, B.Lieblingsfarbe, B.Auto
From A LEFT OUTER JOIN
B on A.ID = B.FK_Person


Aber wieso überhaupt sowas in 2 Tabellen aufteilen?
 
Die Datenbank ist in diesem Fall ein Dokumenten Management System wo ich nach Excel eine Auswertung auswerfe. Also kann ich an der jetzigen Tabellen Struktur leider nix ändern.
Mein Beispiel ist auf ein einfaches Beispiel runtergebrochen, damit es jeder verstehen kann.
 
Zuerst einmal muss in der ersten Zeile der Abfrage dann stehen:
Select A.Name, A.Name2, B.Daten As Beruf, B1.Daten As Lieblingsfarbe, B2.Daten As Auto

Wenn du die jedesmal nur "B.Daten" schreibst steht auch überall das gleiche drin.

Was heißt denn zu wenig Datensätze?
In deinem Beispiel kommt zufällig Karl Heinz aber Lisa fällt ganz raus?

Wenn ja, dann würd ich meinen, dass dies geschieht, da Lisa garkeine Spalte in Tabelle B hat, in der die Nummer mit 3 befüllt ist.
Da dies in der where-Klausel jedoch eine Bedingung ist wird der ganze Datensatz verworfen mit Lisa.

Wenn du deine Abfrage verkürzt auf:

Select A.Name, A.Name2, B.Daten As Beruf, B1.Daten As Lieblingsfarbe
From A
LEFT OUTER JOIN B on A.ID = B.ID
LEFT OUTER JOIN B As B1 on A.ID = B1.ID
Where (B.Nummer = '1' AND B1.Nummer = '2')

dann hast du auch Lisa und Karl, da in diesem Fall auch Lisa alle where-Klauseln erfüllen kann, jedoch ist das Auto dann weg.

edit:
Glaube nicht, dass man deine Abfrage mit einem einzigen Select Befehl abarbeiten kann.
 
Zuletzt bearbeitet:
Ja Du hast Recht, mit der Where Klausel filter er mir zuviele Datensätze. (Manchmal ist man einfach zu Blind :rolleyes:)

Wie bekomme ich aber die Abfrage so hin, dass das Auto auch bei Karl Heinz angezeigt wird und bei Lisa einfach nix steht?
 
Hi,
grunsätzlich bin kein freund von where im join aber bei dir wäre es glaueb ich angebracht.

Code:
Select A.Name, A.Name2, B.Daten As Beruf, B.Daten As Lieblingsfarbe, B.Daten As Auto
From A
LEFT JOIN B on (A.ID = B.ID and B.Nummer=1)
LEFT JOIN B As B1 on (A.ID = B1.ID and B1.Nummer=2)
LEFT JOIN B As B2 on (A.ID = B2.ID and B2.Nummer=3);

wenn du nun nach einer person suchen willst.

Code:
Select A.Name, A.Name2, B.Daten As Beruf, B.Daten As Lieblingsfarbe, B.Daten As Auto
From A
LEFT JOIN B on (A.ID = B.ID and B.Nummer=1)
LEFT JOIN B As B1 on (A.ID = B1.ID and B1.Nummer=2)
LEFT JOIN B As B2 on (A.ID = B2.ID and B2.Nummer=3)
where A.ID = 1;
 
Zuletzt bearbeitet: (klammern korrigiert)
Oh wusste garnicht, dass sowas wie where direkt im join mit angegeben werden kann.
Damit geht das denn ja problemlos.
Wieder was dazugelernt ;D
 
Zurück
Oben