可能的相关子查询

时间:2016-05-26 08:08:02

标签: sql correlated-subquery

我是子查询的新手,现在正在尝试了解问题。

我有一个问题:

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。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

如果将建议与原始查询的不同选项相关性,那也将是好的。祝你有个美好的一天。

2 个答案:

答案 0 :(得分: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

修改

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

执行SELECT DISTINCT删除重复的行,并返回与GROUP BY版本相同的结果。

答案 1 :(得分:0)

为了您的理解,子查询必须只返回每行的一个值。你的代码:

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

将返回多个值,因为您按SalesOrderDetail.SalesOrderID进行分组,结果集将包含与表中不同SalesOrderDetail.SalesOrderID一样多的行。

所以你必须删除group by子句,它会起作用。否则,如果你想根据SalesOrderDetail.SalesOrderID获得相应的值,那么你必须使用where子句,如 jarlh 回答:

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

将为结果设置每行的值,并使用SalesOrderDetail.SalesOrderID进行过滤。

希望你明白。