2016-12-08 1 views
0

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.

+0

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. –

+0

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

+0

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

Antwort

1

für jede Zeile in der äußeren Abfrage (das ist, wo P1 ist), kann nur eins Wert für P1.categoryid sein. Daher untersucht die Unterabfrage nur die Zeilen in p2 (die Tabelle Products in der Unterabfrage), in der categoryid mit der categoryid der einzelnen Zeile in der äußeren Abfrage übereinstimmt, die verarbeitet wird. Es ist genau das gleiche wie für einen Join. Wie der Abfrageprozessor die zwei Datensätze zusammenführt, bleibt dem Abfrageprozessor überlassen. Es stehen verschiedene Mischtechniken zur Verfügung.

effektiv, da die Unterabfrage in einer Klausel, wo ist, filtert sie einfach die Ergebnismenge alle Zeilen zu beseitigen, in denen der Preis je Einheit ist nicht der niedrigsten Stückpreis in dieser Kategorie von Produkten. h. es wählt das preisgünstigste Produkt in jeder Kategorie aus.

Verwandte Themen