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

在数据不是完整序列时使用Oracle序列

  •  1
  • Slimy43  · 技术社区  · 6 年前

    给定一个DB表,其中包含一个唯一的序列作为主键,以及一个附加值VAL;

    enter image description here

    这里的问题是,如果序列是4,我选择nextval,它会给我一个不正确的值(一个%a值而不是%b值)。

    我能想到的一个解决方案是使用带有'more than'而不是'equals'的序列,例如(请原谅伪代码,我可以稍后计算出正确的语法);

    select pkey, val from table where val like '%b' and pkey>seq.currval
    

    alter sequence seq set currval=pkey
    

    在一个小上下文中,作为性能测试的一部分,许多虚拟用户将访问此表,每个虚拟用户都需要能够运行一个查询,以获得唯一的值(因此vuser 1获得58b,vuser 2获得24b,等等)。数据不能预先排序或筛选。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Gordon Linoff    6 年前

    你只想计算最后的值吗 b ?

    select pkey, val,
           (case when val like '%b'
                 then row_number() over (partition by (case when val like '%b' then 1 else 0 end) order by pkey
                                        )
            end) as b_seq
    from table;
    

    如果要查找与特定行相对应的行,可以将其用作子查询 b_seq

    如果您不关心其他值,那么使用 where

    select pkey, val,
           row_number() over (order by pkey) as b_seq
    from table
    where val like '%b';
    
        2
  •  0
  •   The Impaler    6 年前

    基于戈登的回答,我会:

    with
    x as (
      select seq.nextval as s
    ),
    y as (
      select pkey, val,
           row_number() over (order by pkey) as b_seq
      from table
      where val like '%b'
    )
    select y.* from y join x on y.b_seq = x.s