Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL交叉应用于三个表_Sql_Sql Server_Msdn_Cross Apply - Fatal编程技术网

SQL交叉应用于三个表

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。这

我试图结合3表使用交叉应用在一个时间效率庄园。我可以得到我想要的结果,但是运行时间太长了。这三个表格是:

-CUSTOMERS,其中包含CustomerIdprimary key和CurrentSetType列

-历史记录,其中包含CustomerIdforeign key、SetType和TimeStamp列

-UPDATELIST,其中包含CustomerId列

我的目标是从历史中为UPDATELIST中的每个CustomerId找到与CurrentSetType不同的最新SetType。这是美化的“撤消”按钮的一部分。我认为我的问题是客户和历史记录表非常庞大,我不认为在对整个事情进行交叉应用之前,我会将它们配对到较小的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,我的第一个想法是这样的:

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。因此,在你的问题中添加标签。学会正确标记。不到一秒钟!使用“行数”是个好主意,它可以让你完全跳过使用“顶数”