2009-11-10 5 views
1

Compte tenu trois tables: une table de voiture, une table de figurants et une table de lien, quelque chose comme:Oracle PL/SQL Denomalised Résultats

table_car 
--------- 
int car_id 
string make 
string model 

table_extras 
------------ 
int extra_id 
string extra 

table_car_extras_link 
--------------------- 
int car_id 
int extra_id 

Je voudrais écrire un proc stocké PL/SQL qui renvoie des données de la manière suivante:

car_id, make, model, extra[] 

Je suis vraiment un novice en matière de bases de données, donc toute aide appréciée. Notez que dans notre système réel, nous allons revenions 1000s des « voitures » avec chaque voiture ayant jusqu'à environ 10 « extras »

Répondre

4

Cela devrait être juste une vue, pas besoin d'une procédure:

create view myview as 
select c.car_id, c.make, c.model, WM_CONCAT(e.extra) as extras 
from table_car c, table_car_extras_link l, table_extras e 
where c.car_id=l.car_id and l.extra_id=e.extra_id 
group by c.car_id; 

WM_CONCAT est comme SUM pour les chaînes. Pour les techniques de concaténation, voir this page.

+4

+1: lien agréable, résume toutes les techniques disponibles. Vous voudrez peut-être ajouter que WM_CONCAT n'est pas pris en charge et n'est pas documenté. Dans 11gR2 vous utiliserez LISTAGG (documenté ici: http://download.oracle.com/docs/cd/E11882_01/server.112/e10592/functions087.htm#SQLRF30030) –

2

ce qui suit travaillera en 9i et au-dessus, il utilise Tom Kyte's concatenation function:

SELECT c.car_id, c.make, c.model, stragg(e.extra) 
    FROM table_car c 
    LEFT JOIN table_car_extras_link ce ON c.car_id = ce.car_id 
    LEFT JOIN table_extras e ON ce.extra_id = e.extra_id 
GROUP BY c.car_id, c.make, c.model 
Questions connexes