Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/09/2011, 14h34   #1
Modérateur
 
Avatar de SergioMaster
 
Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 3 617
Détails du profil
Informations personnelles :
Nom : Serge Girard
Âge : 55
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2007
Messages : 3 617
Points : 4 522
Points : 4 522
Par défaut Cherche de trou dans une sequence numérique

Bonjour

voici mon problème simplifié :
j'ai une séquence de code numériques , générés par un trigger 'classique'

CREATE TABLE TEST
( CODE BIGINT NOT NULL, // générateur
....
)

je souhaite retrouvé les trous dans cette séquence pour cela j'utilise
la requête suivante

Code :
1
2
3
4
5
6
 
SELECT CODE AS C,
CAST(rdb$get_context('USER_TRANSACTION', 'row#') AS BIGINT) AS r,
rdb$set_context('USER_TRANSACTION', 'row#',
COALESCE(cast(rdb$get_context('USER_TRANSACTION', 'row#') AS integer), 0) + 1) AS X
FROM TEST ORDER BY 1
ce qui me donne (test) le résultat escompté

Citation:
C R X
--------------
1 1 0
2 2 1
4 3 1
5 4 1
maintenant je souhaiterais Obtenir le premier enregistrement ou C est différent de R ce qui dans mon cas donnerai C=4 R=3 .

je me suis dit qu'en passant par une CTE cela devrait fonctionner mais , surprise , pas moyen

Code :
1
2
3
4
5
6
7
8
9
10
11
 
WITH T1 AS
(SELECT CODE AS C,
CAST(rdb$get_context('USER_TRANSACTION', 'row#') AS BIGINT) AS r,
rdb$set_context('USER_TRANSACTION', 'row#',
COALESCE(cast(rdb$get_context('USER_TRANSACTION', 'row#') AS integer), 0) + 1) AS X
FROM TEST ORDER BY 1)
 
SELECT * FROM T1 <---- me donne le m^me résultat : NORMAL ^^
SELECT * FROM T1 WHERE C<>R <------ renvoi rien 
SELECT * FROM T1 t WHERE t.C<>t.R <------ renvoi rien
ou est mon erreur ? y a t-il un autre moyen ?
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 08h41   #2
Modérateur
 
Avatar de SergioMaster
 
Serge Girard
Développeur informatique
Inscription : janvier 2007
Messages : 3 617
Détails du profil
Informations personnelles :
Nom : Serge Girard
Âge : 55
Localisation : France

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : janvier 2007
Messages : 3 617
Points : 4 522
Points : 4 522
Par défaut Eureka mais Pourquoi ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
WITH T AS
(SELECT  CODE AS C,
CAST(rdb$get_context('USER_TRANSACTION', 'row#') AS BIGINT) AS r,
rdb$set_context('USER_TRANSACTION', 'row#',
COALESCE(cast(rdb$get_context('USER_TRANSACTION', 'row#') AS integer), 0) + 1) AS X
FROM MODELE ORDER BY 1
)
 
SELECT FIRST 1 C,R,Min(X)  FROM t
GROUP BY 1,2
HAVING CODE<>R
Me donne bien ce que je cherche , mais pourquoi ai-je été obligé de passer par un Group By ?
__________________
La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
SergioMaster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/10/2011, 11h17   #3
Invité de passage
 
Homme
Inscription : octobre 2011
Messages : 1
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : octobre 2011
Messages : 1
Points : 1
Points : 1
Il existe une requete simple & rapide pour trouver le plus petit numéro disponible ( ou trou ) d'une table

On cherche dans la table ma_table sur le champ mon_id
On suppose que le champ mon_id est de type numérique
A vous d'adapter dans votre contexte

Code :
1
2
3
4
5
6
7
8
9
SELECT IF ((
SELECT 1
FROM `ma_table`
WHERE mon_id = 1) IS NULL,1, MIN(a.mon_id)+1) FreeID
FROM `ma_table` a
WHERE NOT EXISTS (
SELECT b.mon_id
FROM `ma_table` b
WHERE b.mon_id = (a.mon_id + 1));
osx-siby est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h55.


 
 
 
 
Partenaires

Hébergement Web