IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

Cherche de trou dans une sequence numérique


Sujet :

SQL Firebird

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 036
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut Eureka mais Pourquoi ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Invité de passage
    Homme Profil pro
    Inscrit en
    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
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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));

Discussions similaires

  1. Réponses: 6
    Dernier message: 24/11/2007, 18h48
  2. correction de luminance dans une sequence video
    Par hanane78 dans le forum Traitement d'images
    Réponses: 0
    Dernier message: 20/10/2007, 00h46
  3. enlever la virgule dans une zone numérique
    Par davidzerbib dans le forum Access
    Réponses: 2
    Dernier message: 06/03/2007, 12h05
  4. [XSD] Elements de meme nom dans une sequence
    Par MathiasM dans le forum Valider
    Réponses: 2
    Dernier message: 14/04/2005, 09h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo