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 les enregistrements d'une table sans correspondance dans une autre


Sujet :

Langage SQL

  1. #1
    Membre averti
    Directeur technique
    Inscrit en
    Novembre 2006
    Messages
    584
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 584
    Points : 403
    Points
    403
    Par défaut Trouver les enregistrements d'une table sans correspondance dans une autre
    Bonjour à tous,
    J'ai deux tables
    Courrier avec un clef IDCourrier
    Destinataire avec un clef Destinataire et aussi la clef IDCourrier

    Il peut y avoir 0 ou plusieurs destinataires pour un Courrier

    Je cherche bêtement à connaitre les Courrier qui n'ont aucun Destinataire... et je sèche.

    Pouvez-vous mais donner une indication ?

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 345
    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 345
    Points : 39 743
    Points
    39 743
    Billets dans le blog
    9
    Par défaut
    bonjour


    Plusieurs possibilités

    avec EXISTS.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      select CO.CO_id
           , CO.CO_numero
           , CO.CO_date
      from courrier CO
      where not exists
           (select 1
            from destinataire DS
            where DS.CO_id = CO.CO_id)
      order by CO.CO_id
    Ou encore une jointure outer en testant la nullité d'une colonne "not null"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      select select CO.CO_id
           , CO.CO_numero
           , CO.CO_date
      from courrier CO
      left join destinataire DS
        on DS.CO_id = CO.CO_id
      where DS.DS_id is null

  3. #3
    Membre averti
    Directeur technique
    Inscrit en
    Novembre 2006
    Messages
    584
    Détails du profil
    Informations personnelles :
    Âge : 61

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 584
    Points : 403
    Points
    403
    Par défaut
    Bojour,
    Merci escartefigue,
    Je suppose que la deuxième proposition est plus "propre" et plus rapide...

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    806
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 806
    Points : 1 537
    Points
    1 537
    Par défaut
    Bonjour,

    La rapidité d’exécution d'une écriture n'a pas beaucoup de sens en SQL car c'est au moteur d'optimisation de prendre la solution la moins "couteuse" .

    Le problème arrive quand 2 écritures donnent le même résultat mais pas avec les mêmes conditions de traitement.
    Dans ce cas l'optimiseur ne peux pas résoudre les différentes écritures avec le même plan d’exécution.
    Et dès fois les différences sont très très subtiles mais c'est "mathématiquement" pas la même chose.
    Sans oublier qu'en changeant de version de SGBD, l'optimiseur évolue et donc prend des chemins "mathématiques" différents.

    Du coup il faut tester.
    Tester avec plusieurs conditions de volumétrie.
    Si les plans d’exécution restent les mêmes alors on peut choisir la syntaxe qui nous plait.
    Sinon soit les différences sont flagrantes alors on s'adapte, soit c'est négligeable alors on code comme il nous plait (non mais, qui c'est qui le maintient ce fichu code ?)



    Parmi les solutions on aurait pu aussi citer "EXCEPT".

    Pour ma part je préfère aussi la 2ieme syntaxe car plus "ensembliste" et plus courte à écrire qu'avec EXCEPT.

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/03/2014, 21h55
  2. [XL-2010] Récupérer dans une feuilles les enregistrements d'une autre
    Par paulux67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/08/2012, 09h28
  3. Réponses: 2
    Dernier message: 10/07/2009, 19h17
  4. Réponses: 2
    Dernier message: 12/06/2008, 11h53
  5. Réponses: 5
    Dernier message: 06/11/2007, 13h58

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