Использование последовательности Oracle, когда данные не являются полной последовательностью - PullRequest
0 голосов
/ 03 декабря 2018

Учитывая таблицу БД, содержащую уникальную последовательность в качестве первичного ключа и дополнительное значение VAL;

enter image description here

Мне нужно получить значения, которые соответствуют'как% b', но мне нужно получить их по одному в последовательности.Если бы значения были последовательными, я бы просто использовал последовательность Oracle для работы через PKEY, используя nextval, currval и т. Д.

Проблема здесь в том, что если последовательность равна 4, и я иду для nextval, это дает мненеверное значение (значение% a вместо значения% b).

Единственное решение, которое я могу придумать, - это использовать последовательность с «больше», чем «равно», например, (извините за псевдокод, позже я могу выработать правильный синтаксис);

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

А затем сдвиньте последовательность после значения pkey (снова для ясности используйте псевдокод);

alter sequence seq set currval=pkey

Для небольшого контекста эта таблица будет доступна для многих виртуальных пользователей как частьтест производительности, каждый из них должен иметь возможность выполнить запрос, который получит им уникальное значение (поэтому vuser 1 получает 58b, vuser2 получает 24b и т. д.).Данные не могут быть упорядочены или отфильтрованы заранее.

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Основываясь на ответе Гордона, я бы сделал:

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

Таким образом, каждый запрос будет увеличивать последовательность и возвращать одно значение SINGLE из "подмножества b".

0 голосов
/ 03 декабря 2018

Вы просто хотите посчитать значения, заканчивающиеся на 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...