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 :

Alternative à NOT IN


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Alternative à NOT IN
    Bonjour,

    Je débute sur SQL, et je cherche une alternative a NOT IN.
    A titre d'exemple, j'ai deux tables Clients et Banque

    Table Clients
    id name
    1 Nom1
    2 Nom2
    3 Nom3
    4 Nom4

    Table Banque
    id event Payout_id
    1 Event1 3
    2 Event2 2
    3 Nom3 5
    4 Nom4 null


    Est-ce qu'il est possible d'utiliser deux valeurs de tables differentes id et payout_id comme ce code la ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from Client where id NOT IN (SELECT payout_id from Banque)
    Existe t-il une autre solution pour ne pas utiliser NOT IN ?

    Merci beaucoup et bonne journée !

  2. #2
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 997
    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 : 4 997
    Points : 14 303
    Points
    14 303
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Autrefois, NOT EXISTS était beaucoup plus performant que NOT IN , ce n'est plus toujours vrai de nos jours l'optimiseur sait traduire le NOT IN en NOT EXISTS.
    À tester au cas où votre version de SGBD serait un peu dépassée

    Ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select CL.col1
         , CL.col2
         , ...
         , CL.coln
    from client as CL
    where not exists
         (select 1
          from banque as BQ
          where BQ.payout_id = CL.id
         )

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 233
    Points : 26 630
    Points
    26 630
    Par défaut
    Deux alternatives :
    1. Avec NOT EXISTS
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      SELECT  * 
      FROM    Client  clt 
      WHERE   NOT EXISTS 
              (   SELECT  payout_id 
                  FROM    Banque  bnq
                  WHERE   bnq.payout_id = clt.id
              )
      ;
    2. Avec LEFT JOIN ... WHERE ... IS NULL
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      SELECT  * 
      FROM    Client  clt
          LEFT JOIN
              Banque  bnq
              ON  bnq.payout_id = clt.id
      WHERE   bnq.id  IS NULL
      ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 997
    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 : 4 997
    Points : 14 303
    Points
    14 303
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Deux alternatives :
    • Avec LEFT JOIN ... WHERE ... IS NULL
    Attention pour cette solution à bien vérifier qu'il s'agit d'une colonne NOT NULL qui ne peut donc être "null" que si la jointure outer n'est pas satisfaite

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    8 233
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'études décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 8 233
    Points : 26 630
    Points
    26 630
    Par défaut
    En effet, j'aurais du préciser WHERE tb2.pk IS NULL.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    octobre 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : octobre 2019
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    He bien ! Merci pour ces réponses rapides ! Vous m'avez bien aidé !! C'est exactement ce que je cherchais.

    Bonne journée !

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur d'Etude Mainframe/AS400
    Inscrit en
    novembre 2012
    Messages
    1 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur d'Etude Mainframe/AS400
    Secteur : Finance

    Informations forums :
    Inscription : novembre 2012
    Messages : 1 385
    Points : 8 698
    Points
    8 698
    Par défaut
    Bonjour, en DB2/AS400 (je ne sais pas si c'est possible sur MAINFRAME) on peut utiliser l'exception join qui est très élégant je trouve. Ce qui dans le cas présent donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT cli.* from Client cli 
    exception join Banque bq on 
    bq.payout_id= cl.id

  8. #8
    Membre expert
    Homme Profil pro
    Inscrit en
    septembre 2006
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2006
    Messages : 2 663
    Points : 3 760
    Points
    3 760
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Deux alternatives :
    + la technique du MINUS qui peut être efficace ici car PK et probablement FK sont utilisées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    SELECT  * 
    FROM    Client  clt 
    WHERE   id IN 
    (   
    SELECT id FROM Client
    MINUS
    SELECT payout_id FROM Banque  
    )
    Comparez les plans avant de choisir.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    4 997
    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 : 4 997
    Points : 14 303
    Points
    14 303
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Citation Envoyé par Darkzinus Voir le message
    Bonjour, en DB2/AS400 (je ne sais pas si c'est possible sur MAINFRAME) on peut utiliser l'exception join qui est très élégant je trouve. Ce qui dans le cas présent donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT cli.* from Client cli 
    exception join Banque bq on 
    bq.payout_id= cl.id
    C'est une spécificité DB2/400 (DB2 for system i)



    Citation Envoyé par JeitEmgie Voir le message
    + la technique du MINUS qui peut être efficace ici car PK et probablement FK sont utilisées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    SELECT  * 
    FROM    Client  clt 
    WHERE   id IN 
    (   
    SELECT id FROM Client
    MINUS
    SELECT payout_id FROM Banque  
    )
    MINUS ou EXCEPT selon les SGBD

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

Discussions similaires

  1. alterner les couleurs dans un tableau avec xsl
    Par Eithelgul dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 04/05/2015, 00h29
  2. [debutant]alternative à NOT IN
    Par sly33 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/06/2007, 12h02
  3. [Turbo C++] Fonciton containing for are not expanded inline
    Par BuG dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 17/02/2003, 07h48
  4. Component not found
    Par Pm dans le forum XMLRAD
    Réponses: 2
    Dernier message: 28/01/2003, 15h40
  5. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 01h07

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