Joins für Fortgeschrittene
Franz. Z.
- datenbank
0 Rouven0 Vinzenz Mai
Hi,
lese gerade die Seite von Vinzens Mai
http://aktuell.de.selfhtml.org/artikel/datenbanken/fortgeschrittene-joins/mehrfachjoin1.htm
Und da versteh ich was nicht:
SELECT
KK1.KndNr,
Vorname,
Nachname,
Strasse,
PLZ,
Ort
FROM (Kreditkarten AS KK1
INNER JOIN Kreditkarten AS KK2
ON KK1.KndNr = KK2.KndNr)
INNER JOIN Kunden
ON KK1.KndNr = Kunden.KndNr
WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'
soll die Anforderung "Nun möchte die Marketingabteilung wissen, um welche Person es sich handelt, d.h. Vorname, Nachname, Anschrift, … " erfüllen.
Aber reicht da nicht auch:
SELECT
KK1.KndNr,
Vorname,
Nachname,
Strasse,
PLZ,
Ort
FROM Kreditkarten AS KK1
INNER JOIN Kreditkarten AS KK2
ON KK1.KndNr = KK2.KndNr
WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'
Grüße, Franz
Hello,
Vorname,
Nachname,
Strasse,
PLZ,
Ort
FROM Kreditkarten AS KK1
INNER JOIN Kreditkarten AS KK2
wo sollen denn die Daten herkommen? In der Kreditkartentabelle stehen sie nicht!
Wenn du stattdessen Kreditkarten INNER JOIN Kunden meintest, dann fehlt dir wiederum das sowohl als auch bei den Kreditkarteninstituten...
MfG
Rouven
Hallo Franz,
Und da versteh ich was nicht:
SELECT
KK1.KndNr,
Vorname,
Nachname,
Strasse,
PLZ,
Ort
FROM (Kreditkarten AS KK1
INNER JOIN Kreditkarten AS KK2
ON KK1.KndNr = KK2.KndNr)
INNER JOIN Kunden
ON KK1.KndNr = Kunden.KndNr
WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'
soll die Anforderung "Nun möchte die Marketingabteilung wissen, um welche Person es sich handelt, d.h. Vorname, Nachname, Anschrift, … " erfüllen.
in der Erläuterung könnte ich ergänzen, dass sich diese Angaben in der Tabelle Kunden befinden. Ich ging davon aus, dass dies aus dem Abschnitt Beispieldatenbank hervorginge.
Freundliche Grüße
Vinzenz
in der Erläuterung könnte ich ergänzen, dass sich diese Angaben in der Tabelle Kunden befinden. Ich ging davon aus, dass dies aus dem Abschnitt Beispieldatenbank hervorginge.
Hallo Vinzenz,
nein, nein. Die Erläuterung ist völlig ausreichend und ich geh auch davon aus, dass die Infos in der Kundentabelle stehen.
Meine Query ist nicht ganz richtig. Ich frag nochmal neu:
Würde diese Query nicht dasselbe Resultat bringen wie Dein Mherfachjoin?
SELECT
KK1.KndNr,
KK1.Firma,
KK1.Vorname,
KK1.Nachname,
KK1.Strasse,
KK1.PLZ,
KK1.Ort
FROM Kunden AS KK1
INNER JOIN Kreditkarten AS KK2
ON KK1.KndNr = KK2.KndNr
WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'
Grüße, Franz
Hello,
Würde diese Query nicht dasselbe Resultat bringen wie Dein Mherfachjoin?
Nein, und zwar weil...
SELECT
FROM Kunden AS KK1
INNER JOIN Kreditkarten AS KK2
ON KK1.KndNr = KK2.KndNr
WHERE KK1.Firma = 'Mastercard' AND KK2.Firma = 'American Express'
KK1 nun die Kundentabelle ist - sie kennt keine Firma, sie weiß nicht was ein "Mastercard ist".
Um dir direkt die dritte Alternative wegzunehmen:
> ~~~sql
> SELECT
> FROM Kunden AS KK1
> INNER JOIN Kreditkarten AS KK2
> ON KK1.KndNr = KK2.KndNr
> WHERE KK2.Firma = 'Mastercard' AND KK2.Firma = 'American Express'
>
bringt auch nicht das richtige Ergebnis, weil in der Spalte "Firma" niemals sowohl der Wert Mastercard als auch der Wert American Express stehen kann.
Um dir direkt die vierte Alternative wegzunehmen:
SELECT
FROM Kunden AS KK1
INNER JOIN Kreditkarten AS KK2
ON KK1.KndNr = KK2.KndNr
WHERE KK2.Firma = 'Mastercard' OR KK2.Firma = 'American Express'
bringt auch nicht das richtige Ergebnis, weil hier zwar korrekt überprüft wird, ob der Kunde eine Mastercard ODER eine American Express hat, es jetzt aber keine (direkte) Möglichkeit mehr gibt herauszufinden, ob der Kunde BEIDE Karten hat (was ja gefordert war).
MfG
Rouven
--
\-------------------
sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& ([SelfCode](http://selfspezial.atomic-eggs.com/scode/selfcode.php?encodieren))
Buy when there's blood running in the street and sell when everyone is pounding at your door, clawing to own your equities -- Wisdom on Wallstreet