【问题标题】:How can i move this Select Statement with Top我怎样才能用 Top 移动这个 Select 语句
【发布时间】:2014-07-05 04:44:03
【问题描述】:

我正在尝试优化此查询以使用联接而不是此子查询,但对于 Top 1,我有点困惑。

SELECT
    s.ItemNumber
    s.ImportKey
    ,(
        SELECT top 1 MerchandiseGroupID 
        FROM MerchandiseGroup mg 
        WHERE s.StoreDepartment = mg.Name AND c.ClientNumber = s.ClientNumber
    ) as MerchandiseGroupID
FROM dbo.Source s 
INNER JOIN dbo.Client c on s.ClientNumber = c.ClientNumber
INNER JOIN dbo.ClientVendor cv on s.Vendor = cv.ClientVendorName
INNER JOIN dbo.TypeClientWarehouse tw on c.WarehouseCode = tw.WarehouseCode
WHERE s.ImportDate > '2014-05-15 01:00:00.000'

到目前为止我所拥有的:

INNER JOIN
(
    SELECT
        ROW_NUMBER() OVER (PARTITION BY Name ORDER BY MerchandiseGroupID asc) rnum,
        MerchandiseGroupID,
        Name 
    FROM MerchandiseGroup mg
) mhg
    ON s.StoreDepartment = mg.Name AND c.ClientNumber = s.ClientNumber
WHERE s.ImportDate > '2014-05-15 01:00:00.000' AND mg.rnum = 1

【问题讨论】:

  • 无论你采取什么方法,子查询中的 where 子句都会让它运行得更快。

标签: sql join subquery row-number


【解决方案1】:

我认为使用 TOP 1 与将其转换为连接并使用 ROW_NUMBER() 一样最佳,但是如果您想要连接的原因是您可以从表中获取其他字段,则使用 APPLY(您的第一个查询与顶部没有顺序,所以我假设它与您在 JOIN 尝试中的 ROW_NUMBER 函数中相同):

SELECT
    s.ItemNumber,
    s.ImportKey,
    mg.MerchandiseGroupID,
    mg.Name
FROM dbo.Source s 
INNER JOIN dbo.Client c on s.ClientNumber = c.ClientNumber
INNER JOIN dbo.ClientVendor cv on s.Vendor = cv.ClientVendorName
INNER JOIN dbo.TypeClientWarehouse tw on c.WarehouseCode = tw.WarehouseCode
OUTER APPLY
(
    SELECT top 1 MerchandiseGroupID, Name
    FROM MerchandiseGroup mg 
    WHERE s.StoreDepartment = mg.Name 
    AND c.ClientNumber = s.ClientNumber
    ORDER BY MerchandiseGroupID
) mg
WHERE s.ImportDate > '2014-05-15 01:00:00.000'

如果您只想要前 1 条记录,这种方法往往比 ROW_NUMBER 快,但如果您想要特定记录,例如第 3 条记录,则灵活性较差。

不相关,但在使用您拥有的日期格式时要小心,即使这是 ISO 标准,它仍然可能引发错误:

SET DATEFORMAT DMY;
SELECT  CAST('2014-05-15 01:00:00.000' AS DATETIME);

会给你:

消息 242,第 16 级,状态 3,第 2 行

将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 2017-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    相关资源
    最近更新 更多