【问题标题】:Row numbers for a query in informixinformix 中查询的行号
【发布时间】:2010-09-12 06:25:26
【问题描述】:

我正在使用informix数据库,我想要一个查询,您还可以生成一个行号以及查询

喜欢

select row_number(),firstName,lastName 
from students;

row_number() firstName lastName
1            john      mathew
2            ricky     pointing
3            sachin    tendulkar

这里的名字,姓氏来自数据库,其中行号是在查询中生成的。

【问题讨论】:

  • 选择一个答案是礼貌的 - 或者如果没有人回答你的问题,编辑你的问题以便理解是明智的。您的目标应该是选择一个最佳答案 - 请。

标签: database informix row-number


【解决方案1】:

使用 OLAP 表达式,您需要 OVER() 中包含某些内容,因为您不希望分区包含 SORT 子句,如下所示:

SELECT ROW_NUMBER() OVER(ORDER BY lastName, firstName) AS rn, firstName, lastName 

来自学生;

如果您不想按名称排序,您可以使用通过 ROWID 排序将记录输入系统的方式。

【讨论】:

  • 仅适用于11.7及以上版本
【解决方案2】:

选择 sum(1) over (order by rowid) as row_number, M.* from systables M

【讨论】:

    【解决方案3】:

    我知道这是一个老问题,但是由于我刚刚遇到这个问题并且得到了这里没有提到的灵魂,我很难分享它,所以这里是:

    1- 您需要创建一个返回给定范围内数字的函数:

    CREATE FUNCTION fnc_numbers_in_range (pMinNumber INT, pMaxNumber INT)
    RETURNING INT as NUMERO;
    DEFINE numero INT;
    LET numero = 0;
    FOR numero = pMinNumber TO pMaxNumber   
        RETURN numero WITH RESUME;  
    END FOR;    
    END FUNCTION; 
    

    2- 你将这个函数的结果与你想要的表交叉:

    SELECT * FROM TABLE (fnc_numbers_in_range(0,10000)), my_table;
    

    唯一的事情是你必须事先知道你想要的行数,你可以通过 COUNT(*) 函数得到。

    这适用于我的 Informix 数据库,其他实现可能需要一些调整。

    【讨论】:

      【解决方案4】:

      给定一个名为 Table3 的表,有 3 列:

      colnum  name   datatype
      ======= =====  ===
      1       no     text;
      2       seq    number;
      3       nm     text;
      

      注意: seq 是表中的一个字段,具有按升序排列的唯一值。这些数字不必是连续的。

      这里是返回行号(RowNum)和查询结果的查询

      SELECT table3.no, table3.seq, Table3.nm,
            (SELECT COUNT(*) FROM Table3 AS Temp
               WHERE Temp.seq < Table3.seq) + 1 AS RowNum
          FROM Table3;
      

      【讨论】:

      • 这里的格式有待改进。要获得恒定宽度的示例材料,请缩进诸如缩进 4 个空格的“列名数据类型”行之类的内容。减少纯文本缩进。
      【解决方案5】:

      最好的方法是使用(新初始化的)序列。

      begin work;
      create sequence myseq;
      select myseq.nextval,s.firstName,s.lastName from students s;
      drop sequence myseq;
      commit work;
      

      【讨论】:

        【解决方案6】:

        您可能无法在跨多个 DBSpace 分散的表中使用 ROWID,因此任何使用 ROWID 的解决方案都不是特别便携。也强烈建议不要这样做。

        如果您的源表中没有 SERIAL 列(这是将其作为一般概念实现的更好方法),请查看 CREATE SEQUENCE,或多或少等同于 Orrible 函数,该函数在 SELECTed from 时生成唯一编号(与 SERIAL 相反,SERIAL 在插入行时生成唯一编号)。

        【讨论】:

        • 注意:默认情况下,ifx(至少)9、10 和 11 中的 SERIAL 不是唯一的。它将返回到 1。
        【解决方案7】:

        我认为最简单的方法是使用以下代码并相应地调整其返回值。 SELECT rowid, * FROM table

        它适用于我,但请注意,它将返回数据库中的行号,而不是查询中的行号。

        附:这是来自Experts Exchange 的公认答案。

        【讨论】:

        • 没有订阅就看不到“接受的答案”——即使免费,至少也很麻烦。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-16
        • 2021-02-11
        相关资源
        最近更新 更多