Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/12/2012, 16h12   #1
djgje
Invité de passage
 
Inscription : 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
djgje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 16h23   #2
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 671
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 671
Points : 25 524
Points : 25 524
Envoyer un message via MSN à CinePhil
Citation:
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 16h45   #3
djgje
Invité de passage
 
Inscription : octobre 2009
Messages : 20
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 20
Points : 3
Points : 3
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!
djgje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 16h49   #4
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 671
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 671
Points : 25 524
Points : 25 524
Envoyer un message via MSN à CinePhil
Déjà que ce n'était pas clair, maintenant, j'ai l'impression que c'est incohérent !
Citation:
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 16h55   #5
djgje
Invité de passage
 
Inscription : octobre 2009
Messages : 20
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 20
Points : 3
Points : 3
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...
djgje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 17h00   #6
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 671
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 671
Points : 25 524
Points : 25 524
Envoyer un message via MSN à CinePhil
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 17h01   #7
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 671
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 671
Points : 25 524
Points : 25 524
Envoyer un message via MSN à CinePhil
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 17h09   #8
djgje
Invité de passage
 
Inscription : octobre 2009
Messages : 20
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 20
Points : 3
Points : 3
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...
djgje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 17h14   #9
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 671
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 671
Points : 25 524
Points : 25 524
Envoyer un message via MSN à CinePhil
Tu n'as pas répondu à cette question :
Citation:
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 08h44   #10
djgje
Invité de passage
 
Inscription : octobre 2009
Messages : 20
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 20
Points : 3
Points : 3
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!
djgje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 11h02   #11
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 671
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 671
Points : 25 524
Points : 25 524
Envoyer un message via MSN à CinePhil
Résumons...
Citation:
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.

Citation:
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 :
Citation:
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2012, 11h16   #12
djgje
Invité de passage
 
Inscription : octobre 2009
Messages : 20
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 20
Points : 3
Points : 3
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!!
djgje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 11h18   #13
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 671
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 671
Points : 25 524
Points : 25 524
Envoyer un message via MSN à CinePhil
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 12h25   #14
djgje
Invité de passage
 
Inscription : octobre 2009
Messages : 20
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 20
Points : 3
Points : 3
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...
djgje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 17h04   #15
djgje
Invité de passage
 
Inscription : octobre 2009
Messages : 20
Détails du profil
Informations forums :
Inscription : octobre 2009
Messages : 20
Points : 3
Points : 3
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!

++
djgje est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 22h00   #16
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 671
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
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 671
Points : 25 524
Points : 25 524
Envoyer un message via MSN à CinePhil
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 !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h19.


 
 
 
 
Partenaires

Hébergement Web