SQL语法疑问:SELECT子查询使用MAX函数关联另一表字段的原理
关于SELECT子句中关联子查询的运行原理
先看你给出的SQL代码:
SELECT Ord.SalesOrderID, Ord.OrderDate, (SELECT MAX(OrdDet.UnitPrice) FROM Sales.SalesOrderDetail AS OrdDet WHERE Ord.SalesOrderID = OrdDet.SalesOrderID) AS MaxUnitPrice FROM Sales.SalesOrderHeader AS Ord;
这种写法里的子查询叫做相关子查询,它的核心逻辑是子查询会依赖外部查询的每一行数据来计算结果,具体运行步骤如下:
- 第一步:外部查询先从
Sales.SalesOrderHeader(别名Ord)里取出第一行数据,拿到这行的SalesOrderID值。 - 第二步:执行SELECT子句里的子查询,把刚才拿到的
Ord.SalesOrderID代入WHERE条件,在Sales.SalesOrderDetail(别名OrdDet)里找出所有和这个订单ID匹配的明细行,然后计算这些行里UnitPrice的最大值。 - 第三步:把计算出的最大值作为
MaxUnitPrice字段,和当前外部行的SalesOrderID、OrderDate拼成结果集里的一行。 - 第四步:外部查询继续取下一行
Sales.SalesOrderHeader的数据,重复上面的步骤2-3,直到外部表的所有行都处理完毕。
简单说,就是外部表每走一行,子查询就跟着“量身定制”计算一次对应的最大值,所以能实现给每个订单行匹配它自己的最高单价。
这种写法和用JOIN加GROUP BY的效果一致,但相关子查询的写法更直接,适合给每行单独添加一个聚合类的计算字段。
内容的提问来源于stack exchange,提问作者Henri Sula
相关产品推荐
相关产品推荐

