我是子查询的新手,现在正在尝试了解问题。
我有一个问题:
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 :(得分: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
进行过滤。
希望你明白。