不同类型的关联查询
Different types of correlation query
我有自己的查询,我需要使用相关子查询获得相同的输出。我是相关子查询的新手,所以请帮忙。
原查询:
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 部分使用相关子查询,您也可以将其写为:
SELECT customerID, sum(sumOfLines)
FROM
(
SELECT header.CustomerID,
(SELECT sum(Detail.LineTotal) FROM Sales.SalesOrderDetail.LineTotal as Detail WHERE Detail.SalesOrderID = header.SalesOrderID) as sumOfLines
FROM Sales.SalesOrderHeader.CustomerID as header
) sub
GROUP BY customerID
这非常丑陋,并且不会执行得更快。您的 DBMS 很有可能会为两个版本选择相同的执行路径。
更新:我更新了上面的 sql 以使用子查询再次聚合,以便只有唯一的 customerID 通过,因为我们无法在使用相关子查询的查询中的相关子查询上聚合。
我有自己的查询,我需要使用相关子查询获得相同的输出。我是相关子查询的新手,所以请帮忙。
原查询:
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 部分使用相关子查询,您也可以将其写为:
SELECT customerID, sum(sumOfLines)
FROM
(
SELECT header.CustomerID,
(SELECT sum(Detail.LineTotal) FROM Sales.SalesOrderDetail.LineTotal as Detail WHERE Detail.SalesOrderID = header.SalesOrderID) as sumOfLines
FROM Sales.SalesOrderHeader.CustomerID as header
) sub
GROUP BY customerID
这非常丑陋,并且不会执行得更快。您的 DBMS 很有可能会为两个版本选择相同的执行路径。
更新:我更新了上面的 sql 以使用子查询再次聚合,以便只有唯一的 customerID 通过,因为我们无法在使用相关子查询的查询中的相关子查询上聚合。