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

SQL Oracle Discussion :

SELECT distinct à partir de deux tables


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 20
    Points : 9
    Points
    9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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
    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 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 !

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 20
    Points : 9
    Points
    9
    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
    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
    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 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 !

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 20
    Points : 9
    Points
    9
    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
    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
    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 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 !

  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
    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 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
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 20
    Points : 9
    Points
    9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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
    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 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 !

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 20
    Points : 9
    Points
    9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 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 !

  12. #12
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Merci pour ton aide!
    Malheureusement la requête ne passe pas...
    Voici mon erreur, expllicite...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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
    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 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 !

  14. #14
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 20
    Points : 9
    Points
    9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Futur Membre du Club
    Inscrit en
    Octobre 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 20
    Points : 9
    Points
    9
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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
    Avec les jointures en vigueur depuis 20 ans, ce serait mieux !
    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 !

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

Discussions similaires

  1. Requete select distinct mail dans deux tables
    Par calitom dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/06/2008, 15h07
  2. Créer une table a partir de deux tables existantes
    Par Aguiran dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/12/2006, 08h16
  3. [c#]commande Select avec jointure de deux tables
    Par chorokari dans le forum Accès aux données
    Réponses: 6
    Dernier message: 18/10/2006, 14h47
  4. Requete Delete à partir de deux tables
    Par Le_Phasme dans le forum Access
    Réponses: 2
    Dernier message: 09/10/2006, 10h22
  5. [SELECT] sélection croisée entre deux tables
    Par WriteLN dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/03/2005, 11h05

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