2016-05-26 10 views
-1

Ich bin neu bei Unterabfragen und die Korrelation versucht nun, ein Problem zu verstehen.Mögliche Korrelationsunterabfragen

Ich habe eine Abfrage:

SELECT Sales.SalesOrderHeader.CustomerID, SUM(Sales.SalesOrderDetail.LineTotal) 
FROM Sales.SalesOrderDetail 
    INNER JOIN Sales.SalesOrderHeader 
    ON Sales.SalesOrderDetail.SalesOrderID = Sales.SalesOrderHeader.SalesOrderID 
GROUP BY Sales.SalesOrderHeader.CustomerID; 

Ich versuche, die Abfrage mit Unterabfrage Korrelation neu zu schreiben:

SELECT Sales.SalesOrderHeader.CustomerID, 
     (SELECT SUM(Sales.SalesOrderDetail.LineTotal) 
     FROM Sales.SalesOrderDetail 
     GROUP BY SalesOrderDetail.SalesOrderID) 
FROM Sales.SalesOrderHeader 
GROUP BY Sales.SalesOrderHeader.CustomerID; 

Ich habe folgende Fehler und ich verstehe nicht, was ich brauche, um fix:

Unterabfrage gab mehr als 1 Wert zurück. Dies ist nicht erlaubt, wenn die Unterabfrage folgt =,! =, <, < =,>,> = oder wenn die Unterabfrage als ein Ausdruck verwendet wird.

Auch wird es gut sein, wenn verschiedene Optionen Korrelation mit der ursprünglichen Abfrage vorschlagen. Haben Sie einen guten Tag.

Antwort

0

die Gruppe überspringen, indem sie in der Unterabfrage, fügen Sie eine Korrelation statt:

SELECT Sales.SalesOrderHeader.CustomerID, 
     (SELECT SUM(Sales.SalesOrderDetail.LineTotal) 
     FROM Sales.SalesOrderDetail 
     WHERE Sales.SalesOrderDetail.SalesOrderID = Sales.SalesOrderHeader.SalesOrderID) 
FROM Sales.SalesOrderHeader 

Gleiche, mit Tabellen-Aliases:

SELECT soh.CustomerID, 
     (SELECT SUM(sod.LineTotal) 
     FROM Sales.SalesOrderDetail sod 
     WHERE sod.SalesOrderID = soh.SalesOrderID) 
FROM Sales.SalesOrderHeader soh 

Edit:

SELECT DISTINCT soh.CustomerID, 
     (SELECT SUM(sod.LineTotal) 
     FROM Sales.SalesOrderDetail sod 
     WHERE sod.SalesOrderID = soh.SalesOrderID) 
FROM Sales.SalesOrderHeader soh 

Do SELECT DISTINCT um doppelte Zeilen zu entfernen und das gleiche r zurückzugeben wie die GROUP BY Version.

+0

Es wurde 31465 Zeilen 19119 statt. –

+0

Bei Interesse können Sie die Datenbank hier herunterladen. https://msftdbprodsamples.codeplex.com/downloads/get/880661 –

+0

31349 Zeilen erhalten. –

0

Für Ihr Verständnis muss Unterabfrage nur einen Wert für jede Zeile zurückgeben. Ihr Code:

(SELECT SUM(Sales.SalesOrderDetail.LineTotal) 
     FROM Sales.SalesOrderDetail 
     GROUP BY SalesOrderDetail.SalesOrderID) 

wird wieder mehr als ein Wert, weil Sie die Gruppierung von SalesOrderDetail.SalesOrderID und die resultset haben so viele Zeilen wie unterschiedliche SalesOrderDetail.SalesOrderID in der Tabelle sind.

Sie müssen also Gruppenklausel entfernen und es wird funktionieren. Andernfalls, wenn Sie wollen entsprechende Wert haben, wie pro SalesOrderDetail.SalesOrderID dann müssen Sie where-Klausel wie in verwenden jarlh Antwort:

(SELECT SUM(SalesOrderDetail.LineTotal) 
     FROM SalesOrderDetail 
     WHERE SalesOrderDetail.SalesOrderID = SalesOrderHeader.SalesOrderID) 

, die einen Wert pro Zeile der Ergebnismenge geben, auf die mit SalesOrderDetail.SalesOrderID gefiltert wird.

Ich hoffe, Sie verstehen.

+0

Vielen Dank für die Klärung der Situation. Irgendwelche Vermutungen, warum die unterschiedliche Anzahl von Zeilen empfangen wurde? –

+0

Welche Anweisung gibt eine andere Anzahl von Zeilen? –

+0

** Jarlh ** Antwort - 31465 Zeilen. Die ursprüngliche Abfrage - 19119. –