2016-09-25 3 views
2

ich einige Anfragen an die Datenbank zu machen genannt: Nordwind, der beweist, zur Verfügung zu stellen, wenn Sie es von der offiziellen Website herunterladen, führte ich die folgende Abfrage:Wie verarbeitet SQL Server die folgende Abfrage?

SELECT C.CategoryName NAME, 
    P.CATEGORYID CODE, 
    COUNT(*) 'PIECES', 
    SUM(UnitPrice*UnitsInStock) 'AMOUNT' 
FROM 
    Northwind.dbo.Categories C, Northwind.dbo.[products] P 
WHERE 
    P.CategoryID = C.CategoryID 
AND 
    P.CategoryID>2 
GROUP BY 
    P.CategoryID, C.CategoryName 
HAVING SUM(UnitPrice*UnitsInStock)>10000 
ORDER BY 'AMOUNT' DESC; 

Die Abfrage mir die richtigen Ergebnisse schenken :

NAME   CODE  PIECES  AMOUNT 
--------------- ----------- ----------- --------------------- 
Seafood   8   12   13010.35 
Dairy Products 4   10   11271.20 
Confections  3   13   10392.20 

Tatsache ist, dass ich nicht herausfinden kann, wie funktioniert SQL Server die Abfrage berechnen, da viele Operationen beteiligt sind, in einem gewissen Punkt SQL Server eine temporäre Datenbank zu erzeugen, hat die HAVING auszuführen:

HAVING SUM(UnitPrice*UnitsInStock)>10000 

Ich möchte eine Erklärung über die Reihenfolge erhalten, die SQL Server zur Durchführung der Abfrage nimmt, ich meine, was ist die erste und letzte Operation, die SQL Server neben ich kann nicht herausfinden, wie weiß es, dass hat den Betrieb genannt SUM auf die Tabelle mit dem Namen anzuwenden: Produkte,

SUM(UnitPrice*UnitsInStock) 'AMOUNT' 

ich nicht angeben, dass jedoch ist die Berechnung auch den Betrieb, auch die COUNT für mich sehr zweideutig ist, aber mir das richtige Ergebnis ist zu geben, ich wirklich Ich schätze jede detaillierte Erklärung, wie sie diese Abfrage berechnet, danke für die Unterstützung.

Antwort

4

Sie werden in logischer Reihenfolge Verarbeitung einer Abfrage von Itzik Ben-Gan aussehen, er dedicated a whole chapter und im Detail erklärt jede step..The link is here ...

Im Folgenden sind die Klauseln, die in logische ausführen kann Ordnung und Ausgang jeder Klausel der Klausel in der nächsten Phase präsentiert wird ..

5 SELECT 5.2 DISTINCT 7 TOP <TOP_spec> 
            5.1 <select_list> 
           1 FROM <table_operators: JOIN, APPLY, PIVOT, UNPIVOT> 
           2 WHERE <predicate> 
           3 GROUP BY <definition_of_grouping_sets> 
           4 HAVING <predicate> 
           6 ORDER BY <order_by_list> 
           7 OFFSET <offset_spec> FETCH <fetch_spec> 
+0

Dank @TheGrameiswar, das war wirklich hilfreich, – neo33

+0

@TheGameriswar, nur eine kurze Frage, ich das Kapitel las und hier sagt, dass die Reihenfolge in was ich die Abfrage Klauseln eingeben, ist ziemlich anders als sie logisch interpretiert werden, und die Abb Was du hier schreibst, ist die logische Reihenfolge, ist das richtig? – neo33

+0

Was Sie intrreted ist richtig – TheGameiswar