代码之家  ›  专栏  ›  技术社区  ›  Álvaro González

替代行数()以获取行位置?

  •  2
  • Álvaro González  · 技术社区  · 7 年前

    我有一个动态生成的查询,其中可能有一个复杂的 ORDER BY 条款。我需要将行号检索到列中以便进一步处理。我找到的所有文件都指向 ROW_NUMBER() 但除非我遗漏了什么,否则我需要重写查询来移动 订货人 条款:

    SELECT ...
    FROM ...
    JOIN ...
    WHERE ...
    ORDER BY ...
    

    …对此:

    SELECT ..., ROW_NUMBER() OVER(ORDER BY ...) AS RN
    FROM ...
    JOIN ...
    WHERE ...
    

    我当然可以做到这一点,但这需要调整一些被其他不需要的模块共享的复杂代码。

    是否有一个函数变量只检索当前结果集中的行位置?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Vladislav    7 年前

    我见过人们使用的另一种方法是:

    IF (OBJECT_ID('tempdb..#tempresult') IS NOT NULL)
        DROP TABLE #tempresult;
    CREATE TABLE #tempresult (
        idx INT IDENTITY(1,1), 
        ...
    );
    
    INSERT #tempresult ...
    SELECT ...
    FROM ...
    JOIN ...
    WHERE ...
    ORDER BY ...
    

    idx 其实就是我们要找的。 但是,不确定这是否会更优化性能。取决于你的案子。 如果需要,可以用table变量替换temp表,并且 PRIMARY KEY IDX 可以使用。

    一般来说,我总是喜欢 ROW_NUMBER() 总的来说,这是更好的选择。

        2
  •  1
  •   MJH    7 年前

    你可以这样做:

    select  *, row_number() over(order by (select null))
    from    MyTable
    order by Col1
    

    这个 ORDER BY OVER 从句与 订货人 查询的子句。

    order by (select null) 绕过必须提供用于对row_number()函数排序的列的问题。

    如果你对性能有顾虑,你应该对你的情况做一些测试,如果有问题的话再提出一个问题。

        3
  •  0
  •   Álvaro González    7 年前

    对于这些记录,这个精确的特性在编写时似乎没有在sql server中实现,甚至在最新版本中也没有。你需要使用其他技巧,比如 ROW_NUMBER() 或者在接受的答案中解释的临时表技巧。

    (例如,甲骨文拥有 ROWNUM 伪列。)

    推荐文章