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

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….

Print Friendly, PDF & Email