SQL交叉应用于三个表
我试图结合3表使用交叉应用在一个时间效率庄园。我可以得到我想要的结果,但是运行时间太长了。这三个表格是: -CUSTOMERS,其中包含CustomerIdprimary key和CurrentSetType列 -历史记录,其中包含CustomerIdforeign key、SetType和TimeStamp列 -UPDATELIST,其中包含CustomerId列 我的目标是从历史中为UPDATELIST中的每个CustomerId找到与CurrentSetType不同的最新SetType。这是美化的“撤消”按钮的一部分。我认为我的问题是客户和历史记录表非常庞大,我不认为在对整个事情进行交叉应用之前,我会将它们配对到较小的UPDATELIST。我目前的问题是:SQL交叉应用于三个表,sql,sql-server,msdn,cross-apply,Sql,Sql Server,Msdn,Cross Apply,我试图结合3表使用交叉应用在一个时间效率庄园。我可以得到我想要的结果,但是运行时间太长了。这三个表格是: -CUSTOMERS,其中包含CustomerIdprimary key和CurrentSetType列 -历史记录,其中包含CustomerIdforeign key、SetType和TimeStamp列 -UPDATELIST,其中包含CustomerId列 我的目标是从历史中为UPDATELIST中的每个CustomerId找到与CurrentSetType不同的最新SetType。这
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
这是如何工作的?您使用的是哪种SQL?微软,MySql?什么版本?您使用的是什么rdbms?请将您的问题包括在相关的rdbms产品和版本标签中。什么是MSDN SQL???这是SQL Server。因此,在你的问题中添加标签。学会正确标记。不到一秒钟!使用“行数”是个好主意,它可以让你完全跳过使用“顶数”