Accueil du site > Les articles > Récupérer les numéros de séquence libre avec SQL.
Version à imprimer Enregistrer au format PDF

Récupérer les numéros de séquence libre avec SQL.

vendredi 23 décembre 2005, par Serge Gomes Visites  2385 Première mise en ligne le mardi 27 avril 2004.

Une requête SQL pour trouver le 1er numéro de séquence libre pour une zone clé. Très pratique pour combler les vides dans les numéros de séquences.


Exemple

Le fichier ARTIC contient une zone ZONID (clé unique) qui est de type numérique :

+-------+-------------------+
| ZONID |       LIBELLE     |                  
+-------+-------------------+
|  1    | Article N°1       |
+-------+-------------------+
|  2    | Article N°2       |
+-------+-------------------+
|  3    | Article N°3       |
+-------+-------------------+
|  5    | Article N°5       |
+-------+-------------------+
|  6    | Article N°6       |
+-------+-------------------+
|  7    | Article N°7       |
+-------+-------------------+
|  8    | Article N°8       |
+-------+-------------------+
|  9    | Article N°9       |
...

But

Le but est de récupérer le 1er N° libre (article 4) par une requête SQL.

1ère requête, la plus simple.

Cette requête ne fonctionne pas si la table est vide.

SELECT A.ZONID + 1 AS CLE FROM ARTIC A          
WHERE A.ZONID + 1
  NOT IN (SELECT B.ZONID FROM ARTIC B)                                      
ORDER BY CLE
FETCH FIRST 1 ROWS ONLY

2nde requête,

SELECT MIN(A.ZONID - 1 ) AS CNT
  FROM ARTIC A                  
  WHERE NOT EXISTS
  (SELECT * FROM ARTIC B WHERE  B.ZONID = 1)    
UNION                                                                                                      
  SELECT IFNULL(MIN(A.ZONID  +1 ), 1) AS CNT
  FROM ARTIC A      
  WHERE NOT EXISTS
    (SELECT * FROM ARTIC B WHERE
      B.ZONID = (A.ZONID + 1))
     ORDER BY  CNT ASC                                
FETCH FIRST 1 ROWS ONLY                                                                                

3ème requête,

SELECT MIN(A.ZONID) + 1                      
FROM ARTIC A WHERE A.ZONID  + 1      
NOT IN (SELECT B.ZONID FROM ARTIC B)  

Si votre zone est de type ALPHA n’oubliez pas de préfixer ZONID par DEC [DEC(ZONID)]ou CAST....

P.-S.

Ce script SQL fonctionne à partir de la V5R1 (fetch first).