Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 16 sur 16
  1. #1
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 20
    Points : 3
    Points
    3

    Par défaut SELECT distinct à partir de deux tables

    Bonjour à tous,
    alors voilà j'ai un petit sioucis que je n'arrive pas a résoudre, j'espère donc que les experts que vous êtes auront une minute ou deux à me consacrer...
    Voilà le soucis,
    j'ai 2 tables, A et B.
    A: col1a col2a
    B: col1b col2b

    Dans col1a j'ai des numéros, qui ne sont pas uniques.
    Dans col2a j'ai un chiffre qui à sont semblable dans la col1b.
    Dans col2b j'ai une description.

    J'ai besoin de récupérer col1a, col1b et col2b...
    J'arrive a récupérer avec un distinct col1b et col2b, mais quand je veux récupérer col1a, il me duplique toutes mes lignes, une fois sans col1a, une fois avec...

    Voici la requête qui fonctionne, sans récupération de col1a:
    Code :
    1
    2
    3
    SELECT DISTINCT b.col1b, b.col2b
    FROM B b, A a
    WHERE a.col1a = '12' AND a.col2a = b.col1b
    Voici la requête qui me duplique mes lignes, et donc celle a corriger:
    Code :
    1
    2
    3
    SELECT DISTINCT b.col1b, b.col2b, a.col1a
    FROM B b, A a
    WHERE a.col1a = '12' AND a.col2a = b.col1b
    J'espère que c'est clair, c'est pas évident à expliquer et à généraliser...
    Merci d'avance aux cerveaux qui me donneront un peu de leur temps!

    Jérôme

  2. #2
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 770
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 770
    Points : 22 985
    Points
    22 985

    Par défaut

    J'espère que c'est clair, c'est pas évident à expliquer et à généraliser...
    Moyennement...
    Au lieu de généraliser, donne ton cas concret, c'est toujours plus facile à comprendre.

    DISTINCT opère sur toutes les colonnes du SELECT. Comme le valeurs de col1a ne sont pas uniques, c'est normal que tu aies plusieurs fois col1b et col2b.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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 !

  3. #3
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    Désolé pour la clarté alors...
    Voilà ce que ma requête est censée faire:

    Table A:
    Col1a: un numéro, plusieurs lignes ont le même
    Col2a: un numéro, plusieurs lignes ont le même
    Col3a: une unité de mesure

    Table B:
    Col1b: un numéro, unique, qui fait le lien avec la table A (col1a)
    Col2b: une description

    Résultat voulu:
    Pour chaque col2a qui contient un numéro, je voudrais récupérer ce numéro (dans A ou B), la description dans B, et l'unité qui est dans A...
    Je voudrais cependant que mes résultats soient uniques, car il y a des lignes dans A qui ont les mêmes Col1a et Col2a.

    Voilà pour la deuxième tentative...
    Merci d'avance!

  4. #4
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 770
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 770
    Points : 22 985
    Points
    22 985

    Par défaut

    Déjà que ce n'était pas clair, maintenant, j'ai l'impression que c'est incohérent !
    Col1b: un numéro, unique, qui fait le lien avec la table A (col1a)

    Pour chaque col2a qui contient un numéro, je voudrais récupérer ce numéro (dans A ou B)


    Quel est le vrai nom des tables et des colonnes ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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 !

  5. #5
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    C'est bien col1 a désolé...

    Pour les vrais noms de colonnes:

    Table A pidata:
    Col1a: mancode :un numéro, plusieurs lignes ont le même
    Col2a: metadataset :un numéro, plusieurs lignes ont le même
    Col3a: unit :une unité de mesure

    Table B metadatavalue:
    Col1b: name: un numéro, unique, qui fait le lien avec la table A (col1a)
    Col2b: description :une description


    Encore merci...

  6. #6
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 770
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 770
    Points : 22 985
    Points
    22 985

    Par défaut

    En réalité, si je comprends bien, c'est pidata.mancode qui est une clé étrangère référençant metadatavalue.name ?

    Est-ce que, à chaque pidata.mancode ne correspond qu'une seule pidata.unit ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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 !

  7. #7
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 770
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 770
    Points : 22 985
    Points
    22 985

    Par défaut

    En réalité, si je comprends bien, c'est pidata.mancode qui est une clé étrangère référençant metadatavalue.name ?

    Est-ce que, à chaque pidata.mancode ne correspond qu'une seule pidata.unit ?

    Maintenant qu'on a les vrais noms, tu peux nous dire plus concrètement ce que tu veux récupérer comme résultat ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    Je me suis embrouillé moi même désolé...
    En fait c'est pidata.metadataset qui est une clé étrangère référençant metadatavalue.name.

    Je voudrais récupérer:
    -metadatavalue.name
    -metadata.description
    -pidata.unit

    Certaines lignes ont les même pidata.mancode et pidata.metadataset.
    Ma toute première requête:
    Code :
    1
    2
    3
    SELECT DISTINCT b.name, a.descritpion
    FROM metadatavalue b, pidata a
    WHERE a.mancode = '12' AND a.metadataset = b.name
    Elle fonctionne très bien, récupère ce que je veux, SAUF l'unité...
    Et dès que je rajoute l'unité (a.unit) dans mon select, toutes les lignes sont dupliquées, une avec l'unité, l'autre comme avant...

  9. #9
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 770
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 770
    Points : 22 985
    Points
    22 985

    Par défaut

    Tu n'as pas répondu à cette question :
    Est-ce que, à chaque pidata.mancode ne correspond qu'une seule pidata.unit ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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 !

  10. #10
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    Bonjour,
    désolé pour l'absence...
    Pour chaque pidata.mancode correspondent plusieurs pidata.metadataset, parfois avec doublons qui n'en sont pas dans d'autres colonnes...
    Par contre pour chaque pidata.metadataset ne correspond qu'une et une seule pidata.unite.

    Exemple:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pidata:
    mancode         metadataset           unit
    123                1                          kg
    123                1                          kg
    124                1                          kg
    124                3                          ml
    124                4                          cl
    .                    .                          .
    .                    .                          .
    .                    .                          .
    Donc, mancode a plusieurs metadataset, mais chaque metadataset n'a qu'une unité et une description dans la table metadatavalue.
    Merci d'avance!

  11. #11
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 770
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 770
    Points : 22 985
    Points
    22 985

    Par défaut

    Résumons...
    pidata.metadataset qui est une clé étrangère référençant metadatavalue.name
    C'est donc la dessus que s'établit la condition de jointure entre les deux tables.

    pidata.metadataset ne correspond qu'une et une seule pidata.unite
    Donc un DISTINCT sur ce couple ne pose pas de problème.
    Comme par ailleurs metadatavalue.description est unique pour un metadatavalue.name, Un DISTINCT sur le triplet fonctionne toujours.

    Ça tombe bien :
    Je voudrais récupérer:
    -metadatavalue.name
    -metadata.description
    -pidata.unit
    Donc cette requête doit faire l'affaire :
    Code :
    1
    2
    3
    SELECT DISTINCT v.name, v.description, p.unit
    FROM metadatavalue v
    INNER JOIN pidata p ON p.metadataset = v.name
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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 !

  12. #12
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    Merci pour ton aide!
    Malheureusement la requête ne passe pas...
    Voici mon erreur, expllicite...
    Code :
    1
    2
    3
    4
    ORA-01722: invalid number
    01722. 00000 -  "invalid number"
    *Cause:    
    *Action:
    Tu aurais une idée d'où cela pourrait provenir?
    Merci encore!!

  13. #13
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 770
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 770
    Points : 22 985
    Points
    22 985

    Par défaut

    Tu peux donner le script de création des tables ?

    Je subodore des types de colonnes différents entre la clé étrangère et la référence.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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 !

  14. #14
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    Les 2 sont en number(10, 0)...
    Au final, j'ai une query qui fonctionne, mais qui me donne encore des doublons...
    Voici ma requête finale, avec les noms réels de colonnes etc.
    Code :
    1
    2
    3
    4
    5
    6
    SELECT DISTINCT l.name, l.description, l.value, l.src_row_updt, m.unit 
    FROM e2s_metadatavalue_man l 
    INNER JOIN e2s_pidata_man m 
    ON m.fk_metadataset = l.fk_metadataset 
    WHERE m.mancode = '123456' 
    ORDER BY l.src_row_updt ASC
    Pour chaque ligne ou l'unité n'est pas nulle, il me donne une ligne ou elle est nulle et une avec la bonne unité...

    J'espère que ca reste compréhensible...

  15. #15
    Invité de passage
    Inscrit en
    octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : octobre 2009
    Messages : 20
    Points : 3
    Points
    3

    Par défaut

    Pour info,
    mon problème est résolu.
    Le doublon venait du DISTINCT car ma colonne m.unit contenait parfois NULL ou parfois l'unité, 2 choses différentes...
    Du coup j'ai modifié ma requête comme ceci:
    Code :
    1
    2
    3
    4
    5
    SELECT l.name, l.description, l.value, l.src_row_updt, MAX(m.unit)
    FROM e2s_metadatavalue_man l, e2s_pidata_man m
    WHERE m.fk_metadataset = l.fk_metadataset
    AND m.mancode = '123456'
    GROUP BY l.name, l.description, l.value, l.src_row_updt
    En espérant que ça puisse aider.
    Merci à CinePhil pour son aide et sa patience!
    Bonne continuation à tous!

    ++

  16. #16
    Modérateur
    Avatar de CinePhil
    Homme Profil pro Philippe Leménager
    Ingénieur d'études en informatique
    Inscrit en
    août 2006
    Messages
    13 770
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Leménager
    Âge : 51
    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 : 13 770
    Points : 22 985
    Points
    22 985

    Par défaut

    Avec les jointures en vigueur depuis 20 ans, ce serait mieux !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
    Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
    « 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 !

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •