Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 получить иерархию  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 606
Есть 2 таблицы, иерархия и справочник продуктов, хочу получить таблицу вида, может быть максимум 5 уровней иерархии:

id product_lev1_id product_lev1_name product_lev2_id product_lev2_name product_lev3_id product_lev3_name product_lev4_id product_lev4_name product_lev5_id product_lev5_name
1 41 продукт41 31 продукт31 21 продукт21 11 продукт11 1 продукт1
2 32 продукт32 22 продукт22 2 продукт2 2 продукт2 2 продукт2
5 41 продукт41 31 продукт31 15 продукт15 5 продукт5 5 продукт5
11 41 продукт41 31 продукт31 21 продукт21 11 продукт11 11 продукт11
21 41 продукт41 31 продукт31 21 продукт21 21 продукт21 21 продукт21
31 41 продукт41 31 продукт31 31 продукт31 31 продукт31 31 продукт31
41 41 продукт41 41 продукт41 41 продукт41 41 продукт41 41 продукт41
22 32 продукт32 22 продукт22 22 продукт22 22 продукт22 22 продукт22
32 32 продукт32 32 продукт32 32 продукт32 32 продукт32 32 продукт32
15 41 продукт41 31 продукт31 15 продукт15 15 продукт15 15 продукт15


Написал запрос вида, помогите его докрутить до нужного результата.

with hier as 
(

SELECT 1 id,11 par_id,'MAIN' code from dual
UNION
SELECT 11,21,'MAIN' from dual
UNION
SELECT 21,31,'MAIN' from dual
UNION
SELECT 31,41,'MAIN' from dual
UNION
SELECT 41,NULL,'MAIN' from dual
union
SELECT 2,22,'MAIN' from dual
UNION
SELECT 22,32,'MAIN' from dual
UNION
SELECT 32,NULL,'MAIN' from dual
UNION
SELECT 5,15,'MAIN' from dual
UNION
SELECT 15,31,'MAIN' from dual
)
,product as
(
SELECT 1 id,'продукт1' lname from dual
UNION
SELECT 11,'продукт11' from dual
UNION
SELECT 21,'продукт21' from dual
UNION
SELECT 31,'продукт31' from dual
UNION
SELECT 41,'продукт41' from dual
UNION
SELECT 2,'продукт2' from dual
union
SELECT 22,'продукт22' from dual
UNION
SELECT 32,'продукт32' from dual
UNION
SELECT 5,'продукт5' from dual
UNION
SELECT 15,'продукт15' from dual
)


,hh AS 
(
SELECT h.id,h.par_id,p.lname,h.code
FROM hier h
LEFT JOIN product p ON p.id=h.id
WHERE h.code='MAIN'
)

SELECT COALESCE(e.id,d.id,c.id,b.id,a.id) id
,a.id product_lev1_id, a.lname  product_lev1_name
,COALESCE(b.id,a.id) product_lev2_id,COALESCE(b.lname,a.lname) product_lev2_name
,COALESCE(c.id,b.id,a.id) product_lev3_id,COALESCE(c.lname,b.lname,a.lname) product_lev3_name
,COALESCE(d.id,c.id,b.id,a.id) product_lev4_id,COALESCE(d.lname,c.lname,b.lname,a.lname) product_lev4_name
,COALESCE(e.id,d.id,c.id,b.id,a.id) product_lev5_id,COALESCE(e.lname,d.lname,c.lname,b.lname,a.lname) product_lev5_name
FROM hh a
LEFT JOIN hh b ON a.id=b.par_id
LEFT JOIN hh c ON b.id=c.par_id
LEFT JOIN hh d ON c.id=d.par_id
LEFT JOIN hh e ON d.id=e.par_id
WHERE a.par_id IS NULL


Сообщение было отредактировано: 28 апр 21, 13:08
28 апр 21, 13:12    [22315594]     Ответить | Цитировать Сообщить модератору
 Re: получить иерархию  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2317
minya13_85,

Он идеален, не надо ничего докручивать.
28 апр 21, 13:16    [22315598]     Ответить | Цитировать Сообщить модератору
 Re: получить иерархию  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 606
crutchmaster,

так мне надо получить таблицу вида, которую я указал выше, а этот запрос возвращает только нижний уровень и до самого верха. Средние уровни как получить?
28 апр 21, 13:18    [22315600]     Ответить | Цитировать Сообщить модератору
 Re: получить иерархию  [new]
crutchmaster
Member

Откуда: оттуда.
Сообщений: 2317
minya13_85
только нижний уровень и до самого верха

minya13_85
Средние уровни как получить?

Не понял. Почему средние уровни не входят в множество "нижний уровень и до самого верха"?
29 апр 21, 03:44    [22316075]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить