1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : mai 2002
    Messages : 239
    Points : 154
    Points
    154

    Par défaut Requete pour trouver des trous dans une suite

    Bonjour,

    J'ai une table qui a une colonne ID. Ces ID sont supposes etre successifs, mais il arrive qu'il y ait des trous. Est-il possible de batir une requete SQL pour avoir ces trous?

    Merci.


  2. #2
    Modérateur

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 682
    Points : 16 502
    Points
    16 502

    Par défaut

    Probablement, quel est votre SGBD ?

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : mai 2002
    Messages : 239
    Points : 154
    Points
    154

    Par défaut

    Citation Envoyé par Waldar Voir le message
    Probablement, quel est votre SGBD ?
    NexusDB.

    Des utilisateur de Oracle m'ont donne une piste en utilisant le mot cle Dual, mais ca n'existe pas dans NexusDB.

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845

    Par défaut

    Salut !

    Je suppose que NexusDB ne fait pas les fonctions analytiques ?
    Tu cherches ceux pour lesquels (hormis le premier), il n'existe pas de id - 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *
    FROM TaTable a
    WHERE NOT EXISTS (SELECT NULL
    		FROM TaTable b
    		WHERE a.id = b.id -1)
      AND a.id <> (SELECT min(id) FROM TaTable)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  5. #5
    Modérateur

    Homme Profil pro
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    7 682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études en décisionnel
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2008
    Messages : 7 682
    Points : 16 502
    Points
    16 502

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : mai 2002
    Messages : 239
    Points : 154
    Points
    154

    Par défaut

    Citation Envoyé par pacmann Voir le message
    Salut !

    Je suppose que NexusDB ne fait pas les fonctions analytiques ?
    Tu cherches ceux pour lesquels (hormis le premier), il n'existe pas de id - 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *
    FROM TaTable a
    WHERE NOT EXISTS (SELECT NULL
    		FROM TaTable b
    		WHERE a.id = b.id -1)
      AND a.id <> (SELECT min(id) FROM TaTable)
    Merci beaucoup pour ta reponse. En fait, c'est pas exactement ce que je cherchais, mais ca m'a inspire et aide a trouver une solution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ID
    FROM MaTable a WHERE (a.ID - 1 NOT IN (SELECT ID FROM MaTable)
                  AND a.ID <> 0)
    OR (a.ID + 1 NOT IN (SELECT ID FROM MaTable)
                 AND a.ID <> (SELECT Max(ID) FROM MaTable))
    ORDER BY ID
    Merci encore une fois.

  7. #7
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 15 633
    Points : 30 816
    Points
    30 816
    Billets dans le blog
    4

    Par défaut

    Citation Envoyé par Ben_Le_Cool Voir le message
    Bonjour,

    J'ai une table qui a une colonne ID. Ces ID sont supposes etre successifs, mais il arrive qu'il y ait des trous. Est-il possible de batir une requete SQL pour avoir ces trous?
    Comment sont générés ces ID à l'insertion des données dans la table ?
    La présence des trous ne serait-elle pas due à la suppression de lignes dans la table ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : mai 2002
    Messages : 239
    Points : 154
    Points
    154

    Par défaut

    Citation Envoyé par CinePhil Voir le message
    Comment sont générés ces ID à l'insertion des données dans la table ?
    La présence des trous ne serait-elle pas due à la suppression de lignes dans la table ?
    Ces ID c'est juste des donnees que je recois d'une autre table. Pour des raisons diverses, il se peut que certains ID ne soient pas transferes a ma table.

  9. #9
    Modérateur
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    15 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2006
    Messages : 15 633
    Points : 30 816
    Points
    30 816
    Billets dans le blog
    4

    Par défaut

    Et quel est le but de la recherche de ces trous ?
    Si l'autre table est sur le même serveur, une jointure externe entre les deux tables permettrait de lister les trous très facilement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.ID
    FROM autretable AS a
    LEFT JOIN tableaAtrous AS t ON a.ID = t.ID
    WHERE t.ID IS NULL
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : mai 2002
    Messages : 239
    Points : 154
    Points
    154

    Par défaut

    Me requete finale donnerait ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM (SELECT TOP 50000  ID FROM MaTable a 
     WHERE (a.ID - 1 NOT IN (SELECT TOP 50000 ID FROM MaTable))
     UNION All
     SELECT TOP 50000 ID FROM MaTable a 
     WHERE (a.ID + 1 NOT IN (SELECT TOP 50000 ID FROM MaTable)
     AND a.ID <> (SELECT TOP 50000 Max(ID) FROM MaTable)))
     ORDER BY ID
    Sur une table de 12000 enregistrements, ca prend environ 2 secondes. Y a un moyen d'optimiser cette requete?

    Merci.

    PS: Sur cette requete, j'ai automatiquement le premier enregistrement, c'est fait expres parce que ca m'aide dans la suite de mon traitement.

  11. #11
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

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

    Informations forums :
    Inscription : mai 2002
    Messages : 239
    Points : 154
    Points
    154

    Par défaut

    Citation Envoyé par CinePhil Voir le message
    Et quel est le but de la recherche de ces trous ?
    Si l'autre table est sur le même serveur, une jointure externe entre les deux tables permettrait de lister les trous très facilement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.ID
    FROM autretable AS a
    LEFT JOIN tableaAtrous AS t ON a.ID = t.ID
    WHERE t.ID IS NULL
    Au fait, l'autre Table se trouve sur une autre application et je recois les enregistrements un par un via des evenements.

  12. #12
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845

    Par défaut

    Hmmm, deux secondes, c'est pas vraiment la mort

    Tu as le plan d'exécution ?

    Petite remarque au passage :
    Tu ne devrais pas plutôt utiliser UNION sans le ALL ? (genre quand t'as un id isolé "par le haut et par le bas", il va ressortir deux fois)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/06/2014, 17h05
  2. Trouver le nombres d'arrangement des intercalaires dans une suite
    Par bizulk dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 20/02/2012, 11h40
  3. pb pour alignées des entrées dans une listbox
    Par zx10 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 23/11/2006, 19h30
  4. Réponses: 2
    Dernier message: 17/10/2006, 11h25
  5. Réponses: 5
    Dernier message: 14/05/2006, 12h57

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