Ton*_*ony 0 sql t-sql sql-server aggregate-functions cross-apply
我读过的大多数文档都表明,CROSS APPLY 的行为方式与 INNER JOIN 类似,只有在两个源表中都有匹配的行时,行才会包含在输出中。
然而,情况似乎并不总是如此,例如,如果您运行以下 SQL 查询,结果将包含 3 行,其中一行包含许多 NULL,因为右侧表中没有行:
CREATE TABLE #Order
(
Id int PRIMARY KEY
)
CREATE TABLE #OrderItem
(
OrderId int NOT NULL,
Price decimal(18, 2) NOT NULL
)
INSERT INTO #Order
VALUES(1), (2), (3)
INSERT INTO #OrderItem
VALUES(1, 10), (1, 20), (3,100)
SELECT *
FROM #Order o
CROSS APPLY
(
SELECT SUM(Price) AS TotalPrice, COUNT(*) AS Items, MIN(Price) AS MinPrice
FROM #OrderItem
WHERE OrderId = o.Id
) t
DROP TABLE #Order
DROP TABLE #OrderItem
Run Code Online (Sandbox Code Playgroud)
有谁知道这是为什么?
发生这种情况的原因是因为聚合是标量聚合。
矢量聚合体
需要一个GROUP BY子句,即使是空集()
如果输入没有行,则根本不返回行
标量聚合
无GROUP BY条款
即使没有输入行,也始终只返回一行。COUNT回报0,别人回报NULL。
您使用的是标量聚合,因此始终返回一行。
要获得向量聚合,您需要添加GROUP BY
SELECT *
FROM #Order o
CROSS APPLY
(
SELECT SUM(oi.Price) AS TotalPrice, COUNT(*) AS Items, MIN(oi.Price) AS MinPrice
FROM #OrderItem oi
WHERE oi.OrderId = o.Id -- always specify inner table in column references
GROUP BY () -- the empty set
-- alternatively
GROUP BY oi.OrderId
) t
Run Code Online (Sandbox Code Playgroud)
另请参阅 @PaulWhite 撰写的这篇优秀文章:标量和向量聚合的乐趣
| 归档时间: |
|
| 查看次数: |
2246 次 |
| 最近记录: |