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 :

Where not exists


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut Where not exists
    Bonjour à tous,

    Je n'arrive pas à faire fonctionner correctement le NOT EXISTS pour comparer deux tables (une agrégée et l'autre non) Donc j'ai les mêmes colonnes et le même typage des données.

    Je n'ai pas de clés unique mais je passe par un clustered unique index avec 8 colonnes qui me servent de clés unique en gros.

    Si je fais simplement un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM A
    WHERE NOT EXISTS (SELECT * FROM B)
    Il est sensé me ramener les lignes de A qui ne sont pas présentes dans B ?

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    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 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Il faut une contrainte dans le NOT EXISTS :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select *
    from A
    where not exists (select null from B where B.colonne1 = A.colonne1 and B.colonne2 = ...)

    Car là, vous prenez toutes les lignes de A sauf s'il existe des lignes dans B : il n'y a pas de critère pour matcher les lignes de A et B
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous pourriez passer par un EXCEPT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM A
    EXCEPT
    SELECT *
    FROM B

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    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 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Avec Oracle, on pourrait aussi faire avec un not IN :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select c1, c2, c3, c4 ...
    from A
    where (c1, c2, c3, c4 ...) not in (
      select c1, c2, c3, c4 ...
      from B
    )
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant Décisionnel
    Inscrit en
    Janvier 2012
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2012
    Messages : 128
    Points : 84
    Points
    84
    Par défaut
    Merci pour ces réponses,
    Je vais essayer les 3 méthodes du coup !

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    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 198
    Points : 12 774
    Points
    12 774
    Par défaut
    allez, pour la forme, on peut aussi utiliser une jointure externe:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select t1.*
    from t1
    left outer join t2 on t1.c1 = t2.c1 and t1.cé = t2;Cé
    where t2.c1 is null

    Tatayo.

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

Discussions similaires

  1. SQL SELECT WHERE NOT EXISTS
    Par talietotoro dans le forum Requêtes
    Réponses: 6
    Dernier message: 21/08/2023, 07h27
  2. Améliorer une requete where not exists
    Par first racing dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/11/2010, 17h10
  3. Update Where not Exists
    Par wclef dans le forum Langage SQL
    Réponses: 4
    Dernier message: 09/03/2010, 10h50
  4. A propos de la clause "Where NOT EXIST"
    Par Bouga74 dans le forum Développement de jobs
    Réponses: 7
    Dernier message: 19/06/2009, 15h26
  5. Insert .. where not exists
    Par Zolex dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 02/03/2007, 11h26

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