SQL Cross应用三个表

时间:2018-04-23 21:13:56

标签: sql sql-server msdn cross-apply

我正在尝试使用Cross Apply在一个节省时间的庄园中组合3个表。我可以得到我想要的结果,但运行时间太长了。这三个表是:

- CUSTOMERS,其中包含CustomerId列(主键)和CurrentSetType

- HISTORY,其中包含CustomerId列(外键),SetTypeTimeStamp

- UPDATELIST,其中包含CustomerId

我的目标是为SetType中与HISTORY不同的CustomerId中的UPDATELIST找到最新的CurrentSetType(这是一个美化的“撤消”按钮)。我相信我的问题是,CUSTOMERSHISTORY表格非常庞大,而且我不认为我在执行此操作之前将它们配对到较小的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

1 个答案:

答案 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

这是如何运作的?