Diskussion:Einführung in SQL: Mehr zu JOIN
Abschnitt hinzufügenWelcher JOIN passt wann?
[Bearbeiten]Das schöne Beispiel mit Paaren (= Eltern) und Kindern habe ich gelesen bei Mark Sandy (alzaimar) unter Delphi-Praxis. Danke sehr! -- Juetho 13:53, 2. Jan. 2010 (CET)
Cross Join
[Bearbeiten]Ich bin mir nicht sicher, ob das auch im ANSI-SQL so definiert ist, aber im Oracle gibt es noch eine spezielle Formulierung, mit der man deutlich machen kann, dass man ein karthesisches Produkt herstellen will und nicht etwa nur die Join-Bedingung vergessen hat:
SELECT * FROM Mitarbeiter CROSS JOIN Dienstwagen
Ale Ergebnis wird jede Kombination eines Mitarbeiters mit einem Dienstwagen ausgegeben, also n mal m Sätze. Man kann die Wegebnissmenge auch noch weiter einschränken durch Ergänzung einer WHERE-Klausel:
SELECT * FROM Mitarbeiter M CROSS JOIN Dienstwagen D WHERE M.Name = 'Meier' and D.hat_ABS = 'YES' OR M.Name = 'Huber' and D.PS < 100
Jetzt werden auch alle Kombinationen ausgegeben, aber für Frau Meier kommen nur Dienstwagen mit ABS in Frage und Herr Huber darf nur Autor mit weniger als 100 PS fahren.
Wenn man nun dieses Ergebnis moch mit einem INNER JOIN mit der Tabelle Fahrzeugbuchung verbindet, dann kann man genau sehen, an welche Fahrzeuge am 2.12.2009 in Hamburg zur Verfügung stehen.
SELECT * FROM Mitarbeiter M CROSS JOIN Dienstwagen D INNER JOIN Fahrzeugbuchung F ON D.KZF_KZ = F.KFZ_KZ WHERE ( M.Name = 'Meier' and D.hat_ABS = 'YES' OR M.Name = 'Huber' and D.PS < 100 ) AND F.Datum = to_date('02.12.2009','dd.mm.yyyy') AND F.Standort = 'Hamburg' AND F.Status = 'noch nicht gebucht'
--Julius-m 18:03, 19. Dez. 2009 (CET)
- Die Variante CROSS JOIN ist mir neu, aber sie ist tatsächlich schon im SQL-Standard 2003 vorgesehen und auch in den anderen von mir untersuchten DBMS (Firebird, MS-SQL, MySql) vorhanden, wenn auch teilweise nur als Äquivalent zu INNER JOIN.
- Ich trage es in die ToDo-Liste ein. Du darfst es gerne auch in das Buch übertragen; bitte bemühe dich aber, bei den Beispielen nur die Beispieldatenbank zu verwenden. -- Juetho 12:36, 20. Dez. 2009 (CET)
- Inzwischen erledigt. -- Juetho 25. Dez. 2009 (CET)