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

Langage SQL Discussion :

Recherche de "trous" dans un compteur


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Recherche de "trous" dans un compteur
    Bonjour à tous,


    J'ai une table qui contient des enregistrements identifiés par un compteur (ce compteur n'est pas la clé primaire de la table, le même numéro de compteur appraît plusieurs fois).

    Je voudrais faire une requête qui me donne la liste des trous dans la numérotation du compteur. Exemple :

    Cpt
    ----------
    14
    16

    ==> Il manque le numéro 15 ...

    Je travaille sous DB2 .

    Par avance, merci

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Points : 1 775
    Points
    1 775
    Par défaut
    Je ne connais pas DB2 mais une solution qui peut être envisageable consisterait à rechercher la valeur maximum de ce compteur.
    Ensuite, je créerai une table dans laquelle j'insèrerai des valeurs de 1 en 1 en partant de 1 jusqu'à la valeur de ton compteur.
    Enfin je ferai une jointure externe sur la table contenant des "trous" et la table de nombre...

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 7
    Points : 7
    Points
    7
    Par défaut
    OK c'est une solution, mais j'aimerais que cette requête puisse être lancée automatiquement toutes les semaines .. y-a-til une autre solution sans utilisation de table temporaire ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 71
    Points : 59
    Points
    59
    Par défaut
    peut être une piste :

    exemple : la table qu'il faut vérifier : 'compteur'
    create table compteur (num integer);

    insert into compteur values (1);
    insert into compteur values (2);
    insert into compteur values (4);
    insert into compteur values (5);
    insert into compteur values (7);

    Une table qui va servir de générateur de nombres : 'nbre':
    create table nbre (nb integer);
    insert into nbre values (0);
    insert into nbre values (1);
    insert into nbre values (2);
    insert into nbre values (3);
    insert into nbre values (4);
    insert into nbre values (5);
    insert into nbre values (6);
    insert into nbre values (7);
    insert into nbre values (8);
    insert into nbre values (9);

    à partir de là :
    SELECT (t2.nb * 10)+(t1.nb * 1) as untrou
    from ( nbre t1 CROSS JOIN nbre t2 )
    where (t2.nb * 10)+(t1.nb * 1) not in (select num from compteur)
    and (t2.nb * 10)+(t1.nb * 1) > (select min(num) from compteur)
    and (t2.nb * 10)+(t1.nb * 1) < (select max(num) from compteur)

    (il faut adapter le cross join (ou produit cartésien normal comme en sql89) pour produire un nombre assez grand...
    c'est un peu couteux, mais bon çà marche

    a améliorer sûrement

    A+

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Il existe une autre solution pour trouver des "trous" dans un compteur, mais cette solution utilise une table temporaire.

    D'abord, tu copie les valeurs dans une table temporaire contenant un champ
    auto-incrémenté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE temp (
    id BIGINT AUTO_INCREMENT,
    compteur BIGINT
    );
     
    INSERT INTO temp (compteur) SELECT valeur_compeur FROM table_compteur ORDER BY valeur_compteur ASC;
    A partir de là, les trous correspondent à des id qui se suivent mais pour lesquels l'écart entre les valeurs de compteur est supérieure à 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT t1.compteur,t2.compteur
    FROM temp AS t1, temp AS t2
    WHERE t2.id = t1.id + 1
    AND t2.compteur-t1.compteur > 1
     
    ou bien
     
    SELECT t1.compteur,t2.compteur
    FROM temp AS t1 INNER JOIN temp AS t2 ON t1.id = t2.id - 1
    WHERE t2.compteur-t1.compteur > 1

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