Ich habe Probleme zu verstehen, wie genau eine innere Unterabfrage (die auf eine äußere Unterabfrage verweist) funktioniert, wenn eine Menge für jede Zeile in der äußeren Abfrage zurückgegeben wird. Ich weiß, was es tut, aber nicht wie es geht.Wie "durchläuft" eine korrelierte Unterabfrage die äußere Unterabfrage?
Im Moment habe ich es als eine "Nested Loop" (aus einem Programmierer Hintergrund, aber nie mit Datenbanken gearbeitet). Aber ich habe Schwierigkeiten, der Schritt-für-Schritt-Logik zu folgen.
Siehe, in einer typischen 'for-Schleife' in jeder Art von Programmiersprache verstehe ich, dass die äußere Schleife zählt und Aktionen ausführen, die verschachtelt sind. Es macht viel Sinn für mich. Aber für das Tsql-Beispiel unten sehe ich einfach nicht WHY die innere Abfrage würde für jede Zeile in der äußeren Abfrage ausgeführt werden. Oder macht es überhaupt?
SELECT categoryid, productid, productname, unitprice
FROM Production.Products AS P1
WHERE unitprice =
(SELECT MIN(unitprice)
FROM Production.Products AS p2
WHERE P2.categoryid = P1.categoryid);
Jetzt nach dem Buch, aus dem diese Probe aus (mit TSQL2012 Datenbank) die Korrelation genommen wird, ist das Prädikat P2.categoryid = P1.categoryid. Und ich verstehe es, P1.category ID wird durch alle Zeilen in categoryid durchlaufen und den minimalen Einheitspreis für jeden von ihnen zurückgeben.
Aber in meinen Gedanken verstehe ich nicht, wie die Abfrage die Werte bestimmt, die P1.categoryid halten wird.
für jede Zeile in der äußeren Abfrage (das ist, wo "P1" ist), kann nur für "P1.categoryid" EINEN Wert sein. Daher untersucht die Unterabfrage nur die Zeilen in 'p2' (die Products-Tabelle in der Unterabfrage), wobei' categoryid' mit der 'categoryid' der einzelnen Zeile in der äußeren Query übereinstimmt, die verarbeitet wird. Es ist genau das gleiche wie für einen Join. Wie der Abfrageprozessor die zwei Sätze von Datensätzen zusammenführt, bleibt dem Abfrageprozessor überlassen. Es stehen verschiedene Mischtechniken zur Verfügung. –
Okay, es macht ein bisschen mehr Sinn für mich, aber ich bin immer noch im Dunst. Siehe, wenn Sie JOIN verwenden und die ON-Klausel angeben, 't1.ID = t2.ID' Für mich macht es Sinn, weil Sie eine dedizierte ON-Klausel (Zeilen übereinstimmen und ein spezielles Schlüsselwort JOIN)). Aber mit zwei SELECT-Anweisungen, wo man verschachtelt ist, wie kann solches Verhalten emuliert werden? – starbyone
Vielleicht lesen auf [logische Abfrageverarbeitung] (http://sqlmag.com/sql-server/logical-query-processing-what-it-and-what-it-means-you), die die Reihenfolge erläutert, in der Teile von Aussagen werden verarbeitet, helfen. Oder es könnte Ihr [Gehirn versuchen zu entkommen] (http://dilbert.com/strip/2016-11-30). – HABO