【问题标题】:RowNumber() Over(Order By x) with a subquery not workingRow_Number() Over(Order By x) 子查询不起作用
【发布时间】:2013-10-27 05:56:38
【问题描述】:

“count”查询运行良好。只要注释部分保持原样,“记录页”查询就可以正常运行。如果未注释它永远不会返回......只是继续。任何有关如何克服这个问题的帮助将不胜感激。

-- Page or records
DECLARE @p0 int;
DECLARE @p1 int;
SET @p0 = 100;
SET @p1 = 20;

SELECT DISTINCT ZIP_CODE, RowNum
FROM     ( SELECT ROW_NUMBER() OVER (ORDER BY ZIP_CODE) as RowNum, ZIP_CODE
           FROM   ODS.PHP1300_DWH.FACETS_MEMBER
           --WHERE LEFT(ZIP_CODE, 5) NOT IN (SELECT SHORT_ZIP_CODE 
                    --                     FROM DWH.Reference.R_ZIP_CODE)
         ) AS x
WHERE    RowNum BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY RowNum

-------------------------------------------------------------------------------------

-- Count
SELECT COUNT(ZIP_CODE)
FROM   ODS.PHP1300_DWH.FACETS_MEMBER  
WHERE  LEFT(ZIP_CODE, 5) NOT IN (SELECT SHORT_ZIP_CODE 
                                 FROM   DWH.Reference.R_ZIP_CODE)

【问题讨论】:

    标签: sql sql-server-2008 pagination row-number


    【解决方案1】:

    我认为派生表中的谓词非常昂贵。没有执行计划很难说。以下是您可以采取的一些措施:

    • 尝试将LEFT(FACETS_MEMBER.ZIP_CODE, 5) 设为computed column 并将其编入索引
    • 确保R_ZIP_CODE.SHORT_ZIP_CODE 上有索引
    • 确保R_ZIP_CODE.SHORT_ZIP_CODE 具有NOT NULL 约束。

    除此之外,我认为您在外部查询中的DISTINCT 关键字是无用的,因为您要添加RowNum,无论如何这对于每条记录都是不同的。因此,您应该将DISTINCT 移动到嵌套查询中,它应该使用DENSE_RANK() 而不是ROW_NUMBER(),如下所述:

    http://blog.jooq.org/2013/10/09/sql-trick-row_number-is-to-select-what-dense_rank-is-to-select-distinct/

    【讨论】:

    • @KeithMyers:最后哪一项措施奏效了?
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 1970-01-01
    • 2023-04-09
    • 2016-11-17
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多