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

Requêtes MySQL Discussion :

Select / Not in select ?


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Webmarketer
    Inscrit en
    Novembre 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmarketer

    Informations forums :
    Inscription : Novembre 2015
    Messages : 22
    Par défaut Select / Not in select ?
    Bonjour,

    je galère avec une requête simple j'imagine ...

    j'ai une table TABLE1(id1, id2)

    id1 et id2 sont des clés primaires.

    Les données sont du genre :
    REF_A , 0
    REF_A , 1

    REF_B , 0
    REF_B , 1

    REF_C , 0

    REF_D , 0
    REF_D , 1

    Dans cet exemple, je veux la requête qui me trouve REF_C , je cherche en effet toutes les références qui n'ont pas de ligne avec id2=1

    Une aide est la bienvenue !

    Merci !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Quelque chose dans ce goût là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT  DISTINCT
            tb1.id1
    FROM    matable tb1
    WHERE   NOT EXISTS
            (   SELECT  NULL
                FROM    matable tb2
                WHERE   tb2.id2 = 1
                    AND tb2.id1 = tb1.id1
            )
    ;
    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.

  3. #3
    Membre Expert Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Par défaut
    ou ce genre à tester ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select distinct(id1) from table1
    where id1 not in (select id1 from table1 where id2 = 0)

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 499
    Par défaut
    Tu peux aussi le faire avec une jointure gauche ouverte (qui permet d'éliminer 90 % des sous-requêtes, si c'est ce que l'on souhaite). L'idée est de faire une jointure vers soi-même en sachant que si le côté droit n'existe pas, le résultat contiendra NULL (ce qui signifie littéralement « néant » en base de données, et pas la valeur nulle). Ensuite, il n'y a plus qu'à sélectionner uniquement les entrées qui correspondent :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
             SELECT id1
               FROM TABLE1 t1
    LEFT OUTER JOIN TABLE1 t2
                 ON t2.id1 = t1.id1
                AND t2.td2 <> 0
              WHERE t2.id1 IS NULL

  5. #5
    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
    Par défaut
    Bonjour,

    Ou bien encore, sans jointure ni sous requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT	id1
    FROM	LaTable
    GROUP BY id1
    HAVING	SUM(CASE WHEN id2 = 1 THEN 1 ELSE 0 END) = 0

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Joli
    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.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 499
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,
    Ou bien encore, sans jointure ni sous requête :
    Pas mal du tout ! On peut même totalement se passer de la clause CASE dans le cas présent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id1 FROM toto GROUP BY id1 HAVING sum(id2)=0;
    Ce qui permettrait de garantir que cela fonctionnerait même avec les SGBD les plus archaïques !

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

Discussions similaires

  1. Réponses: 18
    Dernier message: 05/12/2008, 10h45
  2. Not In(Select ..
    Par Invité dans le forum Access
    Réponses: 11
    Dernier message: 05/08/2006, 12h00
  3. [SQL]: Requête NOT IN SELECT(...)
    Par CAPPE dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/06/2005, 14h06
  4. a,b,c NOT IN (select a,b,c from table)
    Par szdavid dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2005, 09h19

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