SQL 交叉应用三个表
SQL Cross Apply with three tables
我正在尝试使用交叉应用以省时的方式合并 3 个表。我可以获得我想要的结果,但是 运行 时间太长了。这三个表是:
-CUSTOMERS
,其中包含列 CustomerId
(主键)和 CurrentSetType
-HISTORY
,其中包含列 CustomerId
(外键)、SetType
和 TimeStamp
-UPDATELIST
,其中包含 CustomerId
列
我的目标是从 HISTORY
中为 UPDATELIST
中的每个 CustomerId
找到与 CurrentSetType
不同的最新 SetType
(这是美化 'undo' 按钮的一部分)。我相信我的问题是 CUSTOMERS
和 HISTORY
表很大,我不认为在对整个事情。我当前的查询是这样的:
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
我的第一个想法是这样的:
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
这是如何运作的?
我正在尝试使用交叉应用以省时的方式合并 3 个表。我可以获得我想要的结果,但是 运行 时间太长了。这三个表是:
-CUSTOMERS
,其中包含列 CustomerId
(主键)和 CurrentSetType
-HISTORY
,其中包含列 CustomerId
(外键)、SetType
和 TimeStamp
-UPDATELIST
,其中包含 CustomerId
我的目标是从 HISTORY
中为 UPDATELIST
中的每个 CustomerId
找到与 CurrentSetType
不同的最新 SetType
(这是美化 'undo' 按钮的一部分)。我相信我的问题是 CUSTOMERS
和 HISTORY
表很大,我不认为在对整个事情。我当前的查询是这样的:
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
我的第一个想法是这样的:
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
这是如何运作的?