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 :

Trouver valeurs d'une table n'existant pas dans une autre table


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Points : 94
    Points
    94
    Par défaut Trouver valeurs d'une table n'existant pas dans une autre table
    Bonjour à tous,

    En faisant une requête SELECT avec une jointure sur les 2 tables, j'arrive à trouver les valeurs en commun dans les 2 tables.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a.RUE, b.RUE FROM TABLE1 a, TABLE2 b WHERE a.RUE=b.RUE
    Je souhaite maintenant trouver les valeurs de la colonne d'une table qui n'existent pas dans la colonne de l'autre table mais je ne voie pas comment faire.

    Merci d'avance pour votre aide.
    </aliasjcdenton>

    "Un Homme devient vieux lorsque ses regrets prennent la place de ses rêves"

  2. #2
    jnore
    Invité(e)
    Par défaut
    Bonjour,
    Quelque chose du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SELECT RUE
    FROM TABLE1
    WHERE RUE NOT IN (SELECT RUE FROM TABLE2)

  3. #3
    Membre actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2007
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 193
    Points : 213
    Points
    213
    Par défaut
    not in est déconseillé pour des raisons de lenteur d'exécution

    NOT EXISTS alors

    select rue from localite where not exists (select * from employe)
    Fabian M. - DBA Sql server 2008R2.
    Apprenti Admin Système 2008 R2
    Développeur SSRS, SQL
    Développement C# en hobby

  4. #4
    jnore
    Invité(e)
    Par défaut
    Citation Envoyé par oadin Voir le message
    not in est déconseillé pour des raisons de lenteur d'exécution

    NOT EXISTS alors

    select rue from localite where not exists (select * from employe)

    Pas vraiment !!!
    Ca ne fonctionnera pas! EXISTS est un booleen et n'aura pas du tout la meme notion de filtre!

    La sous requete que j'ai proposé est très satisfaisante en terme de performance.
    Ceci dit on peut lui proposer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT RUE
    FROM TABLE1
    EXCEPT
    SELECT RUE
    FROM TABLE2

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2002
    Messages
    152
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 152
    Points : 94
    Points
    94
    Par défaut
    Merci pour vos réponses.

    J'ai tout testé et il est vrai que NOT IN est catastrophique en terme de performances. Il faut encore y ajouter DISTINCT pour avoir une seule fois le nom de chaque rue.

    Sinon, EXCEPT fait très bien l'affaire et est super rapide.

    Merci encore !
    </aliasjcdenton>

    "Un Homme devient vieux lorsque ses regrets prennent la place de ses rêves"

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,
    cela fonctionne trés bien aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T1.ID_valeur
    FROM prod_SUIVI T1
    LEFT OUTER JOIN prod_suivi_SFR T2 ON T1.ID_valeur= T2.ID_valeur
    GROUP BY T1.ID_valeur
    HAVING COUNT( T2.ID_valeur) =0

  7. #7
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Le NOT EXISTS est la solution naturelle et la plus rapide (sous Oracle et SQL Server).
    (A noter que le NOT IN est équivalent au NOT EXISTS sous Oracle, c'est les autres SGBD qui sont trisomniques pour le coup).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from t2
    where not exists (select null from t1 where t1.id = t2.id);
    La solution "LEFT OUTER JOIN" est une solution assez naturelle aussi, mais ne fait pas exactement la même chose s'il y a des doublons dans T1, il faut faire un DISTINCT qui est très consommateur.

    Le EXCEPT est aussi très consommateur dans la mesure où il fait un DISTINCT et n'est pas toujours applicable : il faut que les deux tables aient la même structure. Deplus, cela implique un filtre sur chaque champ, là où le NOT EXISTS porte généralement sur une foreign key, donc un index.
    On ne jouit bien que de ce qu’on partage.

  8. #8
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    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 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tittou Voir le message
    Bonjour,
    cela fonctionne trés bien aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT T1.ID_valeur
    FROM prod_SUIVI T1
    LEFT OUTER JOIN prod_suivi_SFR T2 ON T1.ID_valeur= T2.ID_valeur
    GROUP BY T1.ID_valeur
    HAVING COUNT( T2.ID_valeur) =0
    Perso, je préfère cette syntaxe, qui évite de faire des regroupement totalement inutiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT distinct T1.ID_valeur
    FROM prod_SUIVI T1
    LEFT OUTER JOIN prod_suivi_SFR T2 ON T1.ID_valeur= T2.ID_valeur
    where T2.ID_valeur is null
    On ne jouit bien que de ce qu’on partage.

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

Discussions similaires

  1. Recherche de numéro n'existant pas dans une plage
    Par chaours dans le forum Développement
    Réponses: 6
    Dernier message: 08/11/2010, 13h24
  2. Réponses: 5
    Dernier message: 27/04/2010, 14h55
  3. Réponses: 2
    Dernier message: 29/09/2009, 15h33
  4. [A-03] Existe-t-il une constante "n'existe pas" ?
    Par Tipstitou dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/01/2009, 12h37
  5. Réponses: 2
    Dernier message: 11/11/2007, 16h49

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