代码之家  ›  专栏  ›  技术社区  ›  RRUZ

向SQL Server中的select查询结果添加行号,而不使用row_number()函数

  •  0
  • RRUZ  · 技术社区  · 15 年前

    我需要在不使用row_number()函数的情况下向select查询中添加行号。
    并且不使用用户定义的函数或存储过程。

    Select (obtain the row number) as [Row], field1, field2, fieldn from aTable
    

    更新

    我正在使用sap b1-diapi进行查询,这个系统不允许在select语句中使用rownumber()函数。

    再见。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Mike Clark    15 年前

    我不确定这是否适用于您的特定情况,但是您可以用存储过程执行这个查询吗?如果是这样,你可以:

    a)创建一个包含所有普通结果列的临时表,再加上一个行列作为自动递增标识。

    b)选择Insert your original query,sans the row column(SQL将自动为您填写此内容)

    c)在结果集的临时表上选择*。

    不是最优雅的解决方案,但可以完成所需的行编号。

        2
  •  2
  •   Lukasz Lysik    15 年前

    此查询将为您提供行编号,

    SELECT 
        (SELECT COUNT(*) FROM @table t2 WHERE t2.field <= t1.field) AS row_number,
        field,
        otherField
    FROM @table t1
    

    但是有一些 限制 当你想使用它的时候。您的表中必须有一列(在示例中是 field )它是唯一的和数字的,可以用作参考。例如:

    DECLARE @table TABLE
    (
        field INT,
        otherField VARCHAR(10)
    )
    
    INSERT INTO @table(field,otherField) VALUES (1,'a')
    INSERT INTO @table(field,otherField) VALUES (4,'b')
    INSERT INTO @table(field,otherField) VALUES (6,'c')
    INSERT INTO @table(field,otherField) VALUES (7,'d')
    
    SELECT * FROM @table
    

    收益率

    field | otherField
    ------------------
    1     | a
    4     | b
    6     | c
    7     | d
    

    选择
    (从@table t2中选择count(*),其中t2.field<=t1.field)作为行号,
    字段,
    其他领域
    从@表T1
    

    收益率

    row_number | field | otherField
    -------------------------------
    1          | 1     | a
    2          | 4     | b
    3          | 6     | c
    4          | 7     | d
    

    这是一个没有函数和存储过程的解决方案,但正如我前面所说,这是有限制的。但不管怎样,也许对你来说已经足够了。

        3
  •  1
  •   cdonner    15 年前

    rruz,您可以通过将查询包装在视图中来隐藏函数的使用。它对调用者是透明的。除了前面提到的,我没有其他选择。