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 :

Recherche d'une liste de doc dans des ensembles de doc


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Recherche d'une liste de doc dans des ensembles de doc
    Bonjour,

    Je suis nouveau en SQL et je bute déjà sur un cas.
    J'ai par exemple une table 'ensemble de doc' qui contient 2 colonnes, un 'id_ensemble' et un 'id_doc'.

    'id_ensemble' 'id_doc'
    1 1
    1 2
    2 3
    2 1
    2 2
    3 1
    3 5
    3 2

    Je voudrais récupérer le seul et unique 'id_ensemble', pour lequel les valeurs 'id_doc' sont à 1 et 2. A savoir le 1 dans mon cas.
    Mais pas les autres 'id_ensemble' 2 et 3, puisqu'ils contiennent aussi d'autres 'id_doc' en + du 1 et 2.

    Cela devrait être simple, mais je vois pas comment faire.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Il faut faire une division relationnelle :
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select id_ensemble, count(distinct id_doc)
      from la_table
     where id_doc in (1,2)
     group by id_ensemble
    having count(distinct id_doc) = 2 -- Le 2 correspond au 2 id tester dans le IN
    Si le couple (id_ensemble, id_doc) est clé primaire (ou unique) dans la table alors vous pouvez supprimer le DISTINCT dans le COUNT.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci skuatamad, je comprends mieux pourquoi cela ne s'invente pas

    Par contre la requete me sort les 3 id_ensemble 1,2 et 3.
    Le count des id_doc est à 2 pour chaque ensemble.

    Le =2, c'est bien la quantité des 2 id à tester ?


    Que le id_ensemble est en clé primaire dans la table

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Effectivement, il faut tester sur tous les id_doc de l'id_ensemble, plutôt quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select t1.id_ensemble, count(distinct t1.id_doc)
      from la_table t1
     where t1.id_doc in (1,2)
     group by t1.id_ensemble
    having count(distinct t1.id_doc) = (select count(distinct t2.id_doc) from la_table t2 where t2.id_ensemble = t1.id_ensemble)

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Impec si je recherche les id_doc 1 et 2, l'id_ensemble est bien le 1.
    Par contre si je cherche sur les 1,2 et 3, le résultat me donne les id_ensemble 1,2,3

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Oui, en fait il faut combiner les 2 clauses HAVING précédemment fournies :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select t1.id_ensemble, count(distinct t1.id_doc)
      from la_table t1
     where t1.id_doc in (1,2,3)
     group by t1.id_ensemble
    having count(distinct t1.id_doc) = (select count(distinct t2.id_doc) from la_table t2 where t2.id_ensemble = t1.id_ensemble)
       and count(distinct t1.id_doc) = 3 -- Le nombre d'id_doc inclus dans le IN

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    La requête fonctionne bien avec le résultat que je cherchais à obtenir.
    Vu le haut niveau de cette requête, et mon niveau de débutant, forcément que je ne pouvais la trouver celle-là.
    Je tâcherai de bien la comprendre à tête reposée.
    Merci bcp skuatamad !

  8. #8
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Je vous invite à lire le lien fourni dans mon 1er post qui vous propose également d'autres technique de division relationnelle.

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2019
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2019
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Je vous invite à lire le lien fourni dans mon 1er post qui vous propose également d'autres technique de division relationnelle.
    Bonjour,
    J'y ai jeté un oeil hier mais c'est assez cossu pour moi le débutant.
    Mais une fois un peu plus expérimenté, je lirai.
    Le lien est noté
    Bonne journée à vous

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Pour éviter la sous-requête on peut faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      select id_ensemble
        from la_table
    group by id_ensemble
      having count(distinct id_doc) = 2
         and min(case when id_doc in (1, 2) then 1 else 0 end) = 1;

Discussions similaires

  1. [Batch] Zipper une liste de répertoires dans des archives différentes
    Par Paloma dans le forum Scripts/Batch
    Réponses: 12
    Dernier message: 03/02/2016, 14h25
  2. [MySQL-5.5] Recherche d'une liste de mots dans une chaine
    Par Phiss dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/07/2014, 16h08
  3. Réponses: 3
    Dernier message: 11/03/2013, 22h38
  4. Réponses: 3
    Dernier message: 25/05/2012, 16h53
  5. Recherche d'une liste de valeurs dans une autre
    Par charlebakhtovsky dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 07/02/2011, 09h20

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