我正在尝试使用Cross Apply在一个节省时间的庄园中组合3个表。我可以得到我想要的结果,但运行时间太长了。这三个表是:
- CUSTOMERS
,其中包含CustomerId
列(主键)和CurrentSetType
- HISTORY
,其中包含CustomerId
列(外键),SetType
和TimeStamp
- UPDATELIST
,其中包含CustomerId
列
我的目标是为SetType
中与HISTORY
不同的CustomerId
中的UPDATELIST
找到最新的CurrentSetType
(这是一个美化的“撤消”按钮)。我相信我的问题是,CUSTOMERS
和HISTORY
表格非常庞大,而且我不认为我在执行此操作之前将它们配对到较小的UPDATELIST
交叉应用于整个事情。我目前的疑问是:
DECLARE @UPDATELIST TABLE (Identifier INT NOT NULL PRIMARY KEY);
INSERT INTO @UPDATELIST (Identifier) VALUES (#####); -- a few hundred lines of this
SELECT CustomerId, ITEM.SetType
FROM CUSTOMERS
CROSS APPLY
(SELECT TOP 1 SetType FROM HISTORY
WHERE HISTORY.CustomerId IN (SELECT Identifier FROM @UPDATELIST)
AND HISTORY.CustomerId = CUSTOMERS.CustomerId
AND HISTORY.SetType != CUSTOMERS.CurrentSetType ORDER BY TimeStamp DESC) AS ITEM
对此最有效的查询是什么?
编辑:我使用的是MSDN SQL版本12.0.5532
答案 0 :(得分:1)
我的第一个想法是这样的:
SELECT
CustomerID
, SetType
FROM
(
SELECT
C.CustomerID
, H.SetType
, ROW_NUMBER() OVER (PARTITION BY C.CustomerID ORDER BY H.TimeStamp DESC) R
FROM
CUSTOMERS C
JOIN UPDATELIST U ON U.CustomerId = C.CustomerId
JOIN HISTORY H ON
H.CustomerId = C.CustomerId
AND H.SetType <> C.CurrentSetType
) Q
WHERE R = 1
这是如何运作的?