Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/11/2010, 16h15   #1
Membre régulier
 
Inscription : mars 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 39
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 88
Points : 83
Points : 83
Par défaut ORACLE 10 : Multiple tuples sur une ligne ?

Bonjour,

avec 3 tables dans ce genre :
Code :
1
2
3
UserUnit
userid
unitid
et sachant qu'un utilisateur est lié a 1 ou plusieurs unités.
Je voudrais afficher la liste de tous les utilisateurs ainsi que la (ou les) unité(s) auxquels ils appartiennent.


Faciiiiiiiiiiile me direz vous :
Code :
1
2
3
4
SELECT us.nom, un.libelle
FROM users us, unit un, userunit uu
WHERE us.userid=uu.userid
AND    uu.unitid=un.unitid
Cela va m'afficher cela :
Code :
1
2
3
4
5
6
7
User1 Libelle1
User1 Libelle2
User2 Libelle4
User3 Libelle1
User3 Libelle2
User3 Libelle3
...
mais je voudrais quelque chose qui s'affiche sur une seule ligne dans ce genre-ci :
Code :
1
2
3
4
User1 Libelle1 Libelle2
User2 Libelle4
User3 Libelle1 Libelle2 Libelle3
...
Pas de problème via un script pl-sql, mais existe-t-il un moyen de faire cela avec un simple select sql ?
rafuoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 16h21   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 956
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 956
Points : 18 161
Points : 18 161
Envoyer un message via MSN à CinePhil
Ce que tu cherches à faire est de la cosmétique et n'est pas le boulot du SGBDR mais celui du programme qui interroge la BDD.
Ceci dit, peut-être existe t-il chez Oracle l'équivalent du GROUP_CONCAT de MySQL pour le faire.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 16h23   #3
Membre régulier
 
Inscription : mars 2007
Messages : 88
Détails du profil
Informations personnelles :
Âge : 39
Localisation : Belgique

Informations forums :
Inscription : mars 2007
Messages : 88
Points : 83
Points : 83
Merci Phil, je suis assez d'accord avec toi, c'est de la cosmétique pure et dure

Je vais chercher dans la direction que tu proposes !
rafuoner est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h33   #4
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
C'est vrai, c'est de la cosmétique. Mais bon des fois...

j'ai parlé de ça ici
Code :
1
2
3
4
SELECT table1."Nom", table1."Prenom"
  rtrim(REPLACE(REPLACE(XMLAGG(XMLElement("x", table1."Num-tel") ORDER BY table1."Num-tel" ASC),'<x>', ''),'</x>', '-'),'-') "Tel List"  
    FROM table1
GROUP BY table1."Nom", table1."Prenom"
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h35   #5
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Code :
1
2
3
4
5
6
SELECT us.nom, 
    WM_CONCAT(un.libelle)
FROM users us, unit un, userunit uu
WHERE us.userid=uu.userid
AND    uu.unitid=un.unitid
GROUP BY us.nom
EDIT: ah oui, celle de nuke_y fonctionne aussi

en oracle 11, tu aurais LISTAGG / WITHIN GROUP qui est top, en 10, faut se débrouiller autrement.

A savoir que depuis oracle 9, tu peux aussi directement fabriquer tes propres fonctions d'aggrégats.

Voir l'article très interressant qui répertorie toutes les possibilité pour résoudre ce pb:

http://www.oracle-base.com/articles/...Techniques.php
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 17h43   #6
Membre Expert
 
Avatar de nuke_y
 
Inscription : mai 2004
Messages : 1 812
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 1 812
Points : 1 609
Points : 1 609
Ouh c'est intéressant ça remi4444. J'avais abandonné WM_CONCAT parce que je ne pouvais pas trier, mais si je peux faire mes propres fonctions...
__________________
Il vaut mieux monopoliser son intelligence sur des bêtises que sa bêtise sur des choses intelligentes.

Mon combat pour les droits des consommateurs face aux abus des grandes marques.
nuke_y est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/11/2010, 18h18   #7
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
@nuke_y

Ca dépend dans quelle version tu es. Ils ont mis 11 versions à s'en rendre compte mais enfin oracle a fait une vrai fonction de concaténation avec LISTAGG / WITHIN GROUP ou tu peux justement trier.
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h37.


 
 
 
 
Partenaires

Hébergement Web