【问题标题】:SQL Cross Apply with three tables三个表的 SQL 交叉应用
【发布时间】:2018-04-23 21:13:56
【问题描述】:

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

-CUSTOMERS,有CustomerId(主键)和CurrentSetType这两个列

-HISTORY,具有CustomerId(外键)、SetTypeTimeStamp

-UPDATELIST,其中有CustomerId

我的目标是从HISTORY 中为UPDATELIST 中的每个CustomerId 找到最新的SetType,这与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

【问题讨论】:

  • 您使用的是哪种 SQL?微软,MySql?什么版本?
  • 您使用的是什么 rdbms?请edit您的问题包括相关的rdbms(产品和版本标签)
  • 什么是 MSDN SQL???它是 SQL 服务器。因此,将标签添加到您的问题中。学会正确标记。

标签: sql sql-server msdn cross-apply


【解决方案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

它是如何工作的?

【讨论】:

  • 不到一秒!使用“ROW_NUMBER()”是个好主意,它可以让您完全跳过使用“TOP”
猜你喜欢
  • 2020-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-22
  • 1970-01-01
  • 2021-07-05
  • 2011-03-06
  • 1970-01-01
相关资源
最近更新 更多