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 :

Récupérer des numéros non-existants dans champ unique


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut Récupérer des numéros non-existants dans champ unique
    Bonjour tout le monde

    j'aimerai récupérer les numéros qui ne sont pas présent dans une colonne de ma table (les numéros sont uniques dans cette table)

    C'est une table d'article, ou les numéros sont la clé primaire de la table

    Petite Ex

    N | Article

    1 | article 1
    2 | article 2
    3 | article 3
    5 | article 5
    7 | article 8

    etc etc

    j'aimerai que la requête me retourne les numeros d'articles disponibles ? a savoir 4 et 6 dasn l'exemple
    (le systeme ne fonctionne pas avec uen génération automatique)

    je connais le NOT EXISTS, j'ai essayé ceci mais en l'écrivant je me suis rendu compte que cetait bête de faire une recherche not exists sur le meme requete)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT art_noart
    FROM mgart
    WHERE NOT EXISTS (select art_noart from mgart)
    ORDER BY art_noart
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Plusieurs solutions je pense. Sans trop réfléchir, j'en vois deux.

    1.
    Utiliser une table de référence qui contiendra tous les nombres (entier dans ton cas) jusqu'à une limite à définir suivant tes besoins (ça sert rien à de stocker tous les entier de 1 à 2^31). Tu pourras alors faire une left join dessus pour récupérer les nombres manquant.

    2.
    Utiliser une fonction de fenêtre de fenêtrage combiné à une CTE pour faire une jointure réflexive sur la ligne suivante/précédente et comparer si le numéro correspond bien au numéro +1/-1. Reste le problème de la dernière/première ligne suivant que tu compares avec la ligne suivante/précédent.

    Ma préférence va largement à la solution 1.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Merci pour la réponse

    Mais pour la solution 1 en effet qui semble facile mais je ne peux pas créer de nouvelles tables dans la base
    la soolution 2 par contre, je ne comprends pas du tout

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Quoi qu'il arrive, vous avez besoin d'une table T1 contenant tous les id articles existants (dispos ou non), que vous comparerez avec votre table T0
    Ensuite, vous pouvez utiliser
    - une requete exists telle que vous l'aviez prévue, mais bien sur en se basant sur la table T1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select col1, col2, ... coln 
    from t1
    where not exists
       (select 1
        from t0
        where t0.id = t1.id)
    - une requete outer en testant que l'id est null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select col1, col2, ... coln 
    from t1
    left outer join t0
       on t0.id = t1.id
    where t0.id is null
    - une requete except
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select col1, col2, ... coln 
    from t1
    except
    select col1, col2, ... coln 
    from t0
    EDIT : @Kropernic : vortre solution 2 n'est pas applicable, car elle nécessiterait une liste d'id contigüs, or rien ne le garantit

  5. #5
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Vu que je ne peux pas créer de table comparative je n'ai pas le choix que de sélectionner les existants et de regarder manuellement pour avoir les trous alors

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Je serais très surpris que cette table n'existe pas déjà : il existe forcément une table recensant tous les articles !

    Et comme indiqué dans mon message précédent, la gestion par "trous" n'est pas possible, les id ne sont pas forcément contigüs, il peut y avoir des trous de numérotation : ligne supprimée, identifiant attribué mais jamais commité...

    Renseignez vous sur la présence de la table des articles, peut être n'avez simplement pas les habilitations pour la consulter.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 991
    Points
    12 991
    Par défaut
    Bonjour,
    Avec une petite requête récursive, ça peut le faire (si le SGBD les supporte, mais comme il n'est pas précisé...):
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    declare c1 cursor for
    with recursive r1(Compteur) as
    (
    select max(id) as compteur from article
    union all
    select compteur - 1 from r1 where compteur > 0
    )
    select r1.* from r1
    left outer join article on article.id = r1.compteur where article.id is null

    Tatayo.

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Avec une petite requête récursive, ça peut le faire (si le SGBD les supporte, mais comme il n'est pas précisé...):
    Encore une fois, non LES N°IDENTIFIANTS NE SONT PAS FORCEMENT CONSECUTIFS !

    Toute solution qui ne s'appuie pas sur la table des identifiants articles REELLEMENT EXISTANTS est donc vouée à l'échec !
    Avec cette méthode
    - si l'article n°4 a été supprimé physiquement de la table article par un DELETE, alors vous allez le marquer comme disponible alors qu'il n'existe plus
    - si l'article n°6 n'a jamais été commité ("phantom record"), vous allez également le marquer comme disponible alors qu'il n'a jamais été validé

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 286
    Points : 12 991
    Points
    12 991
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Encore une fois, non LES N°IDENTIFIANTS NE SONT PAS FORCEMENT CONSECUTIFS !
    Tout à fait, sinon à quoi bon chercher les trous ? D'ailleurs on ne sait même pas comment ces numéros sont générés !

    Citation Envoyé par escartefigue Voir le message
    Toute solution qui ne s'appuie pas sur la table des identifiants articles REELLEMENT EXISTANTS est donc vouée à l'échec !
    Avec cette méthode
    - si l'article n°4 a été supprimé physiquement de la table article par un DELETE, alors vous allez le marquer comme disponible alors qu'il n'existe plus
    - si l'article n°6 n'a jamais été commité ("phantom record"), vous allez également le marquer comme disponible alors qu'il n'a jamais été validé
    [/quote]
    Si c'est une table des id REELLEMENT EXISTANTS , le 4 n'a rien à y faire, puisqu'il n'existe plus...

    Je me pose plutôt la question du but recherché : faire un "état des lieux", ou chercher des numéros libre pour les réutiliser ?
    Dans le premier cas ma requête fonctionne, et dans le second cas de toute façon je trouve que c'est un mauvais plan.

    Tatayo.

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    La réponse est ici :
    Citation Envoyé par Jarael Voir le message
    j'aimerai que la requête me retourne les numeros d'articles disponibles ? a savoir 4 et 6 dasn l'exemple
    (le systeme ne fonctionne pas avec uen génération automatique)
    Citation Envoyé par tatayo Voir le message
    Tout à fait, sinon à quoi bon chercher les trous ? D'ailleurs on ne sait même pas comment ces numéros sont générés !
    Un article ne saurait être disponible s'il n'existe plus ou n'a jamais existé, d'où mon alerte sur la méthode
    Même si les identifiants ne sont pas attribués par le SGBD, (il me semble que cette précision n'apparaissait pas initialement, mais peu importe) un DELETE reste un DELETE

    De plus, fonctionnellement, faire une liste des id, sans avoir ni une référence article, ni un libellé, sera d'un intérêt très relatif, ce qui confirme d'autant plus le besoin d'une table des articles existants (id, référence, libellé...)

  11. #11
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    EDIT : @Kropernic : vortre solution 2 n'est pas applicable, car elle nécessiterait une liste d'id contigüs, or rien ne le garantit
    Tout à fait, j'me suis laissé emporter. Ma 2e solution ne sert qu'à repérer les trous, pas ce qui manque... (bien qu'on pourrait éventuellement encore le calculer vu qu'on a les 2 bornes et qu'on cherche apparemment les entiers intermédiaires.

    edit : vu le message précédent, on dirait qu'en fait c'est pas ça finalement... J'ai du mal lire ^^

  12. #12
    Membre à l'essai
    Homme Profil pro
    Qualification Logicielle
    Inscrit en
    Mai 2017
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Qualification Logicielle

    Informations forums :
    Inscription : Mai 2017
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Je serais très surpris que cette table n'existe pas déjà : il existe forcément une table recensant tous les articles !

    Et comme indiqué dans mon message précédent, la gestion par "trous" n'est pas possible, les id ne sont pas forcément contigüs, il peut y avoir des trous de numérotation : ligne supprimée, identifiant attribué mais jamais commité...

    Renseignez vous sur la présence de la table des articles, peut être n'avez simplement pas les habilitations pour la consulter.
    Je travaille sur la table des articles, et comme deviné, elle comporte des trous suite à des deletes !
    La liste des id est récuperer d'un vieux système qui générait des id articles uniques, mais il ne re-remplissait pas les trous, il se contente de continuer son compteur !
    Mon but est de retrouver les numéros manquants disponibles car dans le nouveau système, l'idée est de les réutiliser !

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    C'est une mauvaise idée !

    Pourquoi vouloir combler les trous, un id est une valeur technique, peu importe qu'il y ait des trous

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Jarael Voir le message
    Mon but est de retrouver les numéros manquants disponibles car dans le nouveau système, l'idée est de les réutiliser !
    C'est juste une idée imbécile et stérile et ne sert absolument à rien !!!

    A +

  15. #15
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Quand tu manges de l'emmental, si t'en veux plus, tu en prends une nouvelle tranche, tu rebouches pas les trous de celui que tu viens de manger !

    Bah pour le SGBD, c'est pareil, on va pas aller lui décortiquer l'estomac pour remplir les trous.

  16. #16
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    Quand tu manges de l'emmental, si t'en veux plus, tu en prends une nouvelle tranche, tu rebouches pas les trous de celui que tu viens de manger !

    Bah pour le SGBD, c'est pareil, on va pas aller lui décortiquer l'estomac pour remplir les trous.
    MDR je n'aurais pas pensé à cette excellente illustration

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 01/11/2015, 17h18
  2. Réponses: 24
    Dernier message: 18/10/2013, 17h49
  3. Récupérer des réels non NaN dans un fichier
    Par jyloup dans le forum Fortran
    Réponses: 8
    Dernier message: 05/12/2012, 09h31
  4. Réponses: 7
    Dernier message: 17/09/2008, 16h04
  5. Récupérer des lignes non enregistrées dans une table
    Par leddy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/04/2008, 16h09

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