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 :

Requête SQL : Champ de même valeur pour une même clé étrangère


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Requête SQL : Champ de même valeur pour une même clé étrangère
    Bonjour à tous,

    Cette question a peut-être déjà été posée mais ce n'est pas facile à rechercher. Alors si la réponse existe déjà, je m'excuse par avance pour ce doublon.

    Je requière votre aide pour une requête simple mais que j'aimerai traiter de sans passer par sous-requête ou autre.

    En fait, dans une table que je nommerai tableA, j'aimerai récupérer les enregistrements qui, pour une même clé étrangère "id_tableB" (par ex),ont tous la même valeur dans un champ "champ1".

    J'ai tenté un truc comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT t1.id_tableA,
               t1.id_tableB,
               t1.champ1
    FROM tableA t1,tableA t2
    WHERE t1.id_tableA <> t2.id_tableA
        AND t1.id_tableB = t2.id_tableB
        AND t1.champ1 = t2.champ1
    GROUP BY t1.id_tableA,t1.id_tableB,t1.champ1;
    Cela me ramène les enregistrements voulus mais également des lignes de ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    t1.id_tableB | t1.champ1  | t1.id_tableA
    134520       | value1        | 134521
    134520       | value1        | 134522
    134520       | value2        | 134523
    134520       | value2        | 134524
    Comment faire pour éliminer ces enregistrements? Encore une fois, j'aimerais ne pas faire de sous-requetes mais juste une requete simple. Je pense que c'est possible. C'est un exercice assez scolaire mais je n'arrive pas à mettre le doigt sur la bonne solution.

    En vous remerciant par avance.

    P.S: A priori c'est du SQL de base mais pour info, mon SGBD est un oracle 10.
    P.P.S: Ceci est mon 1er post sur le site. Donc si j'ai commis des erreurs, merci de bien vouloir m'accorder votre clémence

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il nous manque juste un extrait du contenu de tableA pour comprendre exactement de quoi il retourne.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Deux choses à corriger pour commencer :

    1) Un GROUP BY sans fonction de calcul n'a pas de sens

    2) La syntaxe normalisée des jointures est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM table1
    JOIN table2 ON condition de jointure
    La requête réécrite et complétée pour éviter d'avoir les lignes jointes avec elles-mêmes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT t1.id_tableA, t1.id_tableB, t1.champ1
    FROM tableA t1
    INNER JOIN tableA t2 ON t1.id_tableB = t2.id_tableB 
      AND t1.champ1 = t2.champ1 
      AND t1.id_tableA <> t2.id_tableA
    ORDER BY t1.id_tableB, t1.champ1
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Je ne peux pas hélas pas donner d'extraits de la table (confidentiel).

    En gros, ca semblera plus clair, Je bosse sur une appli compta. Ma base comprend des écritures comptables, composées de mouvements comptables (ma tableA). La liaison se fait donc par l'id de l'écriture,contenu dans la table des mouvements (tableA.id_tableB).

    Mes mouvements comportement un champ complément de compte (champ1).

    Je cherche les écritures (et les mouvements associés) pour lesquels tous les mouvements ont le même compléments de compte.

    Donc sur ma table des mouvements, je demande juste l'id, l'id de l'écriture et le champ complément. Les autres infos ne sont pas nécessaires.

    J'espère que cela semble plus clair ainsi énoncé.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Et donc ?
    Avec ma requête c'est mieux ou pas ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Malheureusement non. J'avais mis ce GROUP BY pour éviter les doublons (c'est moche mais efficace).

    Avec cette requete, j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    IdEcriture   Compl.      IdMouvement
    134520	Achat		134522
    134520	Achat		134521
    134520	Four		134524
    134520	Four		134523
    134544	Achat		134546
    134544	Achat		134545
    134544	Four		134548
    134544	Four		134547
    134930	5021		134939
    134930	5021		134938
    134930	5021		134939
    134930	5021		134931
    134930	5021		134938
    134930	5021		134931
    Le resultat attendu serait donc plutôt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IdEcriture   Compl.      IdMouvement
    134930	5021		134931
    134930	5021		134938
    134930	5021		134939

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Et qu'est-ce qui ne va pas dans le résultat ?
    Si je prends les deux premières lignes :
    IdEcriture Compl. IdMouvement
    134520 Achat 134522
    134520 Achat 134521
    On a bien IdEcriture et Compl qui sont identiques pour deux IdMouvement différents.
    C'est pas ça le résultat cherché ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    L'écriture 134520 ne doit pas ressortir car j'obtiens 2 compléments de compte différents (Achat et Four).

    Avec ces données seule l'écriture 134930 doit ressortir avec ses 3 mouvements.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    En fait vous cherchez à trouver des doublons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT t1.id_tableA, t1.id_tableB, t1.champ1
    FROM tableA t1
    INNER JOIN tableA t2 ON t1.id_tableB = t2.id_tableB 
      AND t1.champ1 = t2.champ1 
      AND t1.id_tableA <> t2.id_tableA
    GROUP BY t1.id_tableA, t1.id_tableB, t1.champ1
    HAVING count(*) > 1
    Une précision pour Cinephil sur :
    Un GROUP BY sans fonction de calcul n'a pas de sens
    C'est équivalent à un distinct, ce n'est pas l'écriture la plus appropriée mais celà a bien un sens.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Effectivement, je n'avais pas vu la chose comme ca. La requête fonctionne parfaitement.
    Merci à vous 2 pour temps que vous m'avez consacré.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 01/04/2011, 11h04
  2. Réponses: 4
    Dernier message: 07/01/2010, 12h27
  3. Réponses: 2
    Dernier message: 21/04/2009, 08h16
  4. plusieurs valeurs pour une même énumération
    Par adaneels dans le forum C#
    Réponses: 6
    Dernier message: 10/04/2009, 17h41
  5. Plusieurs valeurs pour une même colonne
    Par maxlegrand dans le forum Langage SQL
    Réponses: 7
    Dernier message: 16/10/2007, 13h32

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