【发布时间】:2021-06-14 14:55:20
【问题描述】:
我读过的大部分文档都表明,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
有人知道这是为什么吗?
【问题讨论】:
-
CROSS APPLY永远不会像OUTER JOIN那样行事。如果您愿意,您需要使用OUTER APPLY。您的子查询将始终返回一行,因为它只包含聚合,因此它始终返回一行。 -
@Larnu 但这正是 op 的查询中没有发生的事情。它返回 3 行,这就是问题
-
3 行是正确的。 1 表中的每一行
#Order. -
我知道这是正确的,但就问题而言,它的行为有点像
OUTER JOIN