【发布时间】:2018-04-23 21:13:56
【问题描述】:
我正在尝试在一个省时的庄园中使用 Cross Apply 组合 3 个表。我可以得到我想要的结果,但是运行时间太长了。这三个表是:
-CUSTOMERS,有CustomerId(主键)和CurrentSetType这两个列
-HISTORY,具有CustomerId(外键)、SetType、TimeStamp 列
-UPDATELIST,其中有CustomerId列
我的目标是从HISTORY 中为UPDATELIST 中的每个CustomerId 找到最新的SetType,这与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
【问题讨论】:
-
您使用的是哪种 SQL?微软,MySql?什么版本?
-
您使用的是什么 rdbms?请edit您的问题包括相关的rdbms(产品和版本标签)
-
什么是 MSDN SQL???它是 SQL 服务器。因此,将标签添加到您的问题中。学会正确标记。
标签: sql sql-server msdn cross-apply