2016-05-26 5 views
-1

Я новичок в подзапросах, и теперь корреляция пытается понять проблему.Возможные корреляционные подзапросы

У меня есть запрос:

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; 

Я пытаюсь переписать запрос с использованием подзапроса корреляции:

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

У меня есть следующее сообщение об ошибке, и я не понимаю, что мне нужно исправить:

Подзапрос возвратил более 1 значения. Это недопустимо, если подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

Также будет хорошо, если будет предлагать различные варианты корреляции с исходным запросом. Хорошего дня.

ответ

0

Пропустить группу, в подзапроса, добавить корреляцию вместо:

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

То же, используя псевдонимы таблиц:

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 

ли SELECT DISTINCT для удаления повторяющихся строк и возврата того же r esult как версия GROUP BY.

+0

Вместо этого вместо этого перешло 31465 строк 19119. –

+0

Если вас интересует, вы можете скачать базу данных здесь. https://msftdbprodsamples.codeplex.com/downloads/get/880661 –

+0

31349 полученных строк. –

0

Для вашего понимания подзапрос должен возвращать только одно значение для каждой строки. Код:

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

будет возвращать более одного значения, потому что вы группирование по SalesOrderDetail.SalesOrderID и ResultSet будет иметь столько же строк, как различные SalesOrderDetail.SalesOrderID в таблице.

Итак, вам нужно удалить группу по условию, и она будет работать. В противном случае, если вы хотите иметь соответствующее значение в соответствии с SalesOrderDetail.SalesOrderID, то вы должны использовать, где положение, как в jarlh Ответ:

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

, который даст результат, установить значение для каждой строки, которая фильтруется с SalesOrderDetail.SalesOrderID.

Упование вы понимаете.

+0

Благодарим вас за разъяснение ситуации. Любые догадки, почему различное количество строк получено? –

+0

Какое утверждение предоставляет различное количество строк? –

+0

** jarlh ** ответ - 31465 строк. Исходный запрос - 19119. –

 Смежные вопросы

  • Нет связанных вопросов^_^