Oracle PL / SQL деномализованные результаты - PullRequest
1 голос
/ 10 ноября 2009

Имеется три таблицы: таблица машин, таблица дополнений и таблица ссылок, что-то вроде:

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

Я хотел бы написать хранимый процесс PL / SQL, который возвращает данные следующим образом:

car_id, make, model, extra[]

, например

1, Ford, Fiesta, sunroof;electric windows
2, BMW, M3, sports pack;alarm;sat nav
3, subary, impreza, leather seats;ABS

Я очень новичок, когда дело доходит до баз данных, поэтому любая помощь приветствуется. Обратите внимание, что в нашей реальной системе мы будем возвращать тысячи «машин», причем у каждого автомобиля будет до 10 «дополнительных»

Ответы [ 2 ]

4 голосов
/ 10 ноября 2009

Это должно быть просто представление, нет необходимости в процедуре:

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 похож на SUM для строк.

См. на этой странице , где описаны методы объединения.

2 голосов
/ 10 ноября 2009

следующее будет работать в 9i и выше, оно использует Функция конкатенации Тома Кайта :

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...