2016-05-17 11 views
0

Ich lerne Training Kit Exam 70 461 und die nächste Abfrage nicht verstanden wird:Funktionieren korrelierte Unterabfragen wie eine Schleife?

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); 

Wie funktionierts?
, wenn ich nicht die haben WHERE-Klausel dann werde ich 1 Ergebnis wie folgt:

SELECT 
     categoryid 
     ,productid 
     ,productname 
     ,unitprice 
FROM Production.Products AS P1 
WHERE unitprice = 
     (SELECT MIN(unitprice) 
     FROM Production.Products AS P2); 

und dann

categoryid productid productname unitprice 
----------- ---------- -------------- ---------- 
    4   33 Product ASTMN 2.50 

aber wenn die erste Abfrage dann ausgeführt wird, erhalte ich:

categoryid productid productname unitprice 
----------- ---------- -------------- ---------- 
1    24 Product QOGNU 4.50 
2    3  Product IMEHJ 10.00 
3    19  Product XKXDO 9.20 
4    33  Product ASTMN 2.50 
5    52  Product QSRXF 7.00 
6    54  Product QAQRL 7.45 
7    74  Product BKAZJ 10.00 
8    13  Product POXFU 6.00 

Ich verstehe es nicht.
Wie funktioniert das?
ist es wie eine Schleife in einer Schleife?
categoryid 1 was ist die äußere Abfrage und dann loop innere Abfrage zu erhalten categoryid 1? 8 mal bis categoryid 8?
Ich kann nicht fortfahren, ohne dies zu verstehen.
Ich arbeite mit SQL Server mit Northwind als das Buch folgt.

+0

Geben Sie Beispieldaten auch ... –

+2

Wenn Sie verstehen möchten, wie eine Abfrage funktioniert, dann müssen Sie über Ausführungspläne lernen. Ein guter Ausgangspunkt ist die Generierung in SSMS (https://technet.microsoft.com/en-us/library/ms178071(v=sql.105).aspx). –

+2

Fragen Sie nach logisch oder physisch? Wenn das physikalisch ist, ist das vom Optimierer abhängig. SQL ist deklarativ. Eine korrelierte Unterabfrage kann als verschachtelte Schleifen ausgeführt werden oder nicht. Das Beispiel, das Sie angeben, kann das obere Segmentsegment verwenden. http://sqlblog.com/blogs/paul_white/archive/2010/07/28/the-segment-top-query-optimization.aspx –

Antwort

0

Korrelierte Unterabfrage ist eine Unterabfrage, die Werte aus der äußeren Abfrage verwendet.

Siehe Beispiel hier http://en.wikipedia.org/wiki/Correlated_subquery

korrelierte Unterabfrage ist eine innere Abfrage von Haupt-Abfrage verwiesen (äußere Abfrage), so dass innere Abfrage betrachtet als wiederholt ausgeführt wird.

Co-Verwandte Vs Nested-SubQueries.

technischer Unterschied zwischen normaler Unterabfrage und Co bezogenen Unterabfrage ist:

  1. Looping: Co-bezogene Teilabfrageschleife unter Haupt-Abfrage; während verschachtelt nicht; daher wird die zugehörige Unterabfrage bei jeder Iteration der Hauptabfrage ausgeführt. Während im Falle von Nested-Abfrage; Unterabfrage wird zuerst ausgeführt, dann wird die äußere Abfrage als nächstes ausgeführt. Daher ist die maximale Anzahl von of executes sind NXM für korrelierte Unterabfragen und N + M für Unterabfragen.

  2. Abhängigkeit (innen nach außen gegen außen nach innen): Im Fall von Co-bezogenen Unterabfrage, hängt innere Abfrage äußeren Abfrage für die Verarbeitung, während in normaler Unterabfrage, äußerte Abfrage auf innere Abfrage abhängt.

3. Leistung: Mit Co-bezogenen Unterabfrageleistung abnimmt, da es NXM- Iterationen anstelle von N + M Iterationen durchführt. ¨ Co-bezogene Sub-Abfrage Ausführung.

Weitere Informationen mit Beispielen:

http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-Sql-Sub-Queries-Nested-Co-related.html

0

In Ihrer ersten Abfrage,

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); 

Abfrage,

SELECT MIN(unitprice) 
FROM Production.Products AS P2 
WHERE P2.categoryid = P1.categoryid 

wählt Mindestpreis für each Kategorie in products Tabelle. zu ihm wird alle records in der Produkttabelle zurückgeben & Einheitspreis wird der minimum Preis für jede Reihe sein.

In Ihrer zweiten Abfrage,

SELECT categoryid, productid, productname, unitprice 
FROM Production.Products AS P1 
WHERE unitprice = 
(SELECT MIN(unitprice) 
FROM Production.Products AS P2) 

Abfrage

SELECT MIN(unitprice) 
FROM Production.Products AS P2 

gibt einen einzelnen Wert. in Ihrem Fall war es 2.50 d.h

Ihre Anfrage

werden
SELECT categoryid, productid, productname, unitprice 
FROM Production.Products AS P1 
WHERE unitprice = 2.50 

so wird es allein einzelne Zeile zurück. Hoffe es klar jetzt

Verwandte Themen