SQL Abfrage
-
Ich hab eine Tabelle Kunden und Orders . In Orders ist der Kunde als FK drin.
Ich suche nun die Kunden die keine Order aufgegeben haben. Ich weiß etwa wie es mit einer where not exist Klausel geht aber leider nicht wie es nur mit outer join geht. Hier mein Versuchselect Customers.CompanyName from Customers left outer join orders on Customers.CustomerID = Orders.CustomerID
ist natürlich falsch ich brauch ja genau das Gegenteil
-
blurry333 schrieb:
select Customers.CompanyName from Customers left outer join orders on Customers.CustomerID = Orders.CustomerID
ist natürlich falsch ich brauch ja genau das Gegenteil
Denk mal darüber nach, was du machen möchtest. Ungetestet, aber ungefähr sowas:
select CompanyName from Customers c right outer join orders o on c.CustomerID = o.CustomerID where o.OrderID is null;
-
ja cool.
Deine Abfrage ist richtig.
Ich versteh aber die zeitliche Reihenfolge nicht ganz. er bildet den outer join.
Jetzt entsteht eine neue Tabelle .Diese neue Tabelle wird jetzt untersucht und die Elemente zurückgeliefert bei denen die orderID NULL ist .
Stimmt das so ?
-
Es wird keine "neue Tabelle gebildet". Es werden die Daten aus zwei Tabellen zusammengejoined und davon selektieren wir dann die Datensätze, deren Order-ID NULL ist. (= NULL geht nicht, dafür braucht es IS NULL.)
Du hättest genausogut LEFT OUTER JOIN benutzen können, aber da hättest du dann eben die Orders-Tabelle vorher angeben müssen und die Customers nachher.
-
@nman:
Der JOIN generiert ein "Rowset" - das könnte man schon als "temporäre Tabelle" oder so bezeichnen.Was LEFT JOIN vs. RIGHT JOIN angeht: bitte niiiiiiemals RIGHT JOIN schreiben, das verwirrt bloss.
Und zu guterletzt: blurry333 hat keine Verbindung zwischen Kurzzeitgedächtnis und Langzeitgedächtnis. Ihm zu antworten ist reine Zeitverschwendung.
-
hustbaer schrieb:
Der JOIN generiert ein "Rowset" - das könnte man schon als "temporäre Tabelle" oder so bezeichnen.
Ich war mir bei "Es entsteht eine neue Tabelle" einfach sehr unsicher, wie blurry333 sich das vorstellt.
Was LEFT JOIN vs. RIGHT JOIN angeht: bitte niiiiiiemals RIGHT JOIN schreiben, das verwirrt bloss.
Ich benutze normalerweise immer left joins, aber hier bot sich der right join aus didaktischen Gründen an.
-
nman schrieb:
hustbaer schrieb:
Der JOIN generiert ein "Rowset" - das könnte man schon als "temporäre Tabelle" oder so bezeichnen.
Ich war mir bei "Es entsteht eine neue Tabelle" einfach sehr unsicher, wie blurry333 sich das vorstellt.
Ich lehne mich damit jetzt sehr weit aus dem Fenster, aber ich glaube dass blurry sich das in dem Fall sogar richtig vorgestellt hat
-
hustbaer schrieb:
Was LEFT JOIN vs. RIGHT JOIN angeht: bitte niiiiiiemals RIGHT JOIN schreiben, das verwirrt bloss.
Warum eigentlich? Nur aus semantischen Gründen, weil RIGHT JOIN eher unüblich ist?
-
Weil RIGHT JOIN unüblich, und für viele ein Hirnverdreher ist.
Jmd. der gewohnt ist mit abstrakten Dingen zu hantieren (Mathe, E-Technik, ...) wird da nur müde lächeln. Aber für viele (mich eingeschlossen) ist RIGHT JOIN viel schwerer zu "lesen". Ich muss das erstmal im Hirn umdrehen, damit ich weiss was passiert.
Und wenn LEFT JOIN und RIGHT JOIN in einer Abfrage gemischt sind, dann ist sowieso alles aus