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 :

Récupérer les résultats d'un table apparaissant aussi dans une autre table


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 61
    Points : 50
    Points
    50
    Par défaut Récupérer les résultats d'un table apparaissant aussi dans une autre table
    Bonjour,

    Ma question est aujourd'hui d'une simplicité enfantine, pourtant je bloque, je pense que je me complique la vie sur ce point.
    En fait, j'ai une table1 et une table2 qui possèdent toutes les deux un champ "Libellé" et je veux récupérer les libellés de ma table1 qui apparaissent aussi dans ma table2. Sachant que je travaille avec Windev, j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT table1.Libelle
    FROM table1,table2
    WHERE
    table1.Libelle = table2.Libelle
    et j'ai aussi fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT table1.Libelle
    FROM table1
    INNER JOIN table2 ON table1.Libelle = table2.Libelle
    WHERE table1.Libelle = table2.Libelle
    Les deux ne renvoient en aucun cas les résultats attendus, je fais erreur et je n'arrive pas à voir où.

    Merci d'avance, bonne journée à vous

  2. #2
    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
    La requête correspond a peu près à ce que vous demandez ! quel est le problème avec le résultat ?

    Quel est le type des colonnes ?

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Dans la seconde requête, la clause WHERE est inutile puisqu'elle reprend la condition de jointure de la ligne précédente, sinon les requêtes correspondent bien au besoin exprimé.
    Une autre manière de faire serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  table1.Libelle
    FROM    table1
    WHERE   EXISTS
            (   SELECT  NULL
                FROM    table2
                WHERE   table1.Libelle = table2.Libelle
            )
    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
    Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 61
    Points : 50
    Points
    50
    Par défaut
    Re-bonjour,

    Les deux champs sont bien de type "Texte"

    J'ai 9100 enregistrements dans ma table1 et donc je souhaite filtrer en affichant parmi ces 9100 enregistrements seulement ceux qui sont déjà connus dans ma table2.

    Cependant, le nombre de résultats affichés dépasse très largement les 9100 ! Alors que le nombre obtenu devrait être en toute logique inférieur ou égale.

    Merci pour votre réponse au fait

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Si les libellés ne sont pas uniques dans chacune des tables, il est tout à fait logique que les lignes se multiplient sous l'effet du produit cartésien.
    Exemple :
    Table1
    Id  Libellé
    1   AA
    2   BB
    3   BB
    
    Table2
    Id  Libellé
    1   AA
    2   BB
    3   AA
    4   BB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  tb1.id  id1
        ,   tb2.id  id2
        ,   tb1.libelle
    FROM    table1  tb1
        INNER JOIN
            table1  tb1
            ON  tb1.libelle = tb2.libelle
    3 lignes dans table1, 4 dans table2, 6 dans le résultat
    id1 id2 libelle
    1   1   AA
    1   3   AA
    2   2   BB
    2   4   BB
    3   2   BB
    3   4   BB
    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
    Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 61
    Points : 50
    Points
    50
    Par défaut
    Merci aieeeuuuuu pour votre réponse et merci aussi al1_24 car votre réponse proposition fonctionne, je viens de la tester

    Cependant j'obtiens mon résultat après une attente assez longue mais cela provient de la grosseur de la base de données j'imagine.

    Sauriez-vous s'il est possible d'optimiser cette requête de manière à obtenir mon résultat plus rapidement ?

  7. #7
    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
    vous pourriez indexer ces colonnes.

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 778
    Points
    30 778
    Par défaut
    L'optimisation passe par l'indexation des colonnes comparées.
    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.

  9. #9
    Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 61
    Points : 50
    Points
    50
    Par défaut
    Justement c'est ce que je voudrais éviter cette "multiplication".

    De fait dans votre exemple, je souhaiterais récupérer comme résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Résultat :
    -AA
    -BB
    -BB
    Auriez-vous une idée de la manière par laquelle je pourrais procéder ?

  10. #10
    Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 61
    Points : 50
    Points
    50
    Par défaut
    D'accord je n'avais pas pensé à l'indexation , merci beaucoup pour cette piste

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    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 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Bonjour,
    Pour supprimer les doublons dans le résultat, un simple DISTINCT devrait suffire non ?

    Tatayo.

  12. #12
    Membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 61
    Points : 50
    Points
    50
    Par défaut
    Merci tatayo pour votre réponse, cependant si j'ai des doublons dans ma table1 j'ai besoin qu'ils apparaissent

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 188
    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 188
    Points : 12 744
    Points
    12 744
    Par défaut
    Dans ce cas au lieu d'une jointure j'utiliserai une sous-requête (avec un IN ou un EXISTS).

    Tatayo.

  14. #14
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    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 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Comme ce que j'ai proposé hier.
    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.

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/10/2012, 17h18
  2. Réponses: 4
    Dernier message: 06/05/2009, 20h15
  3. Réponses: 2
    Dernier message: 10/10/2008, 16h36
  4. Réponses: 6
    Dernier message: 14/04/2008, 10h40
  5. Récupèrer champ d'une table pour mettre dans une autre table
    Par Invité(e) dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 31/03/2008, 23h59

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