2009-04-28 11 views
2

Je dois obtenir deux fois la valeur suivante d'une séquence dans DB2 (version 9.1). Plutôt que d'exécuter ce qui suit à deux reprises:Incrémenter une séquence deux fois dans DB2

SELECT nextval FOR schema.sequence AS id 
FROM dual 

Je voudrais faire quelque chose comme:

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

Sauf ce qui précède incrémente une fois:

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

    1 record(s) selected. 

Suis-je obligé de simplement requête deux fois, ou existe-t-il un moyen de l'incrémenter deux fois dans une requête?

Répondre

6

Ceci est aa peu complexe, mais il fonctionne (je l'ai vérifié en l'exécutant dans 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; 

Ceci est une partie de mon code préféré, et il est récursif SQL. Vous pouvez le faire sans l'objet de séquence, et il va juste générer plusieurs lignes de nombres. Je l'utilise parfois pour insérer des lignes de données de test générées.

0

Ok, c'est un bidouillage, mais les travaux suivants ... J'aimerais voir une réponse plus nette, alors s'il vous plaît poster une réponse si vous en connaissez une!

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

Quels sont les résultats avec:

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

    2 record(s) selected. 
0

il n'y a pas d'ordre, ni double table DB2

+1

schema.sequence était destiné à être un espace réservé pour une séquence à partir de laquelle je devais tirer dual était destiné à être une table générique indiquant que je me fichais de la table que je sélectionne, et il a effectivement ce qui signifie dans d'autres bases de données: http://en.wikipedia.org/wiki/DUAL_table –

0

Juste parce que je suis sur la cueillette vous Mike :-P, voici une autre solution:

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

Il ne fonctionnera que si vous le faites comme deux lignes, comme ici. Mais si vous le faites en une seule ligne:

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

il retournera la même valeur de séquence. :-(

Questions connexes