Увеличить последовательность дважды в DB2


Мне нужно дважды получить следующее значение последовательности в DB2 (версия 9.1). Вместо того, чтобы выполнять следующие действия дважды:

SELECT nextval FOR schema.sequence AS id
FROM dual

Я хотел бы сделать что-то вроде:

SELECT nextval FOR schema.sequence AS id1,
       nextval FOR schema.sequence AS id2
FROM dual

За исключением вышеуказанного только увеличивает его один раз:

ID1         ID2        
----------- -----------
        643         643

  1 record(s) selected.

Я вынужден просто запросить дважды, или есть способ увеличить его дважды в 1 запросе?

4 2
db2

4 ответа:

Это немного сложно, но работает (я проверил, запустив его в DB2 V.9).

WITH GENERATED (KEYVAL) AS
(select 1
   from sysibm.sysdummy1
  UNION ALL
 SELECT KEYVAL + 1
   FROM GENERATED
  WHERE KEYVAL < 2)        -- how many you want

SELECT KEYVAL AS INCREMENT_NUMBER, NEXTVAL FOR schema.sequence
  FROM GENERATED;

Это один из моих любимых кодов, и это рекурсивный SQL. Вы можете сделать это без объекта последовательности, и он будет просто генерировать несколько строк чисел. Я иногда использую его для вставки строк сгенерированных тестовых данных.

Хорошо, это хак, но работает следующее... Я хотел бы увидеть более чистый ответ, поэтому, пожалуйста, напишите ответ, если вы его знаете!

SELECT nextval FOR schema.sequence AS id
FROM (SELECT 1 FROM dual UNION ALL SELECT 1 FROM dual) temp

Который приводит к:

ID         
-----------
        669
        670

  2 record(s) selected.

В DB2 нет ни последовательности, ни двойной таблицы

Просто потому, что я придираюсь к тебе Майк : - П, вот еще одно решение:

VALUES NEXT VALUE FOR schema.sequence, NEXT VALUE FOR schema.sequence;

Это будет работать, если вы сделаете это как две строки, как здесь. Но если вы сделаете это как один ряд:

VALUES (NEXT VALUE FOR schema.sequence, NEXT VALUE FOR schema.sequence);

Он вернет то же значение последовательности. :- (