Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Поиск в дереве  [new]
userrrr
Guest
Понимаю, что задача до боли похожа на https://www.sql.ru/forum/actualthread.aspx?bid=3&tid=264919 , но ввиду того, что уже несколько лет Ораклом не занимаюсь, мозги в этом направлении уже не пашут, и переделать данное там решение под свое, не могу.

Дано 2 таблицы:

WITH a AS
(
SELECT 'A' childId, 'a' label FROM dual UNION ALL
SELECT 'B' childId, 'b' label FROM dual UNION ALL
SELECT 'F' childId, 'f' label FROM dual 
),

b AS
(
SELECT 'A' childId, null parentId FROM dual UNION ALL
SELECT 'B' childId, 'A' parentId FROM dual UNION ALL
SELECT 'C' childId, 'A' parentId FROM dual UNION ALL
SELECT 'D' childId, 'B' parentId FROM dual UNION ALL
SELECT 'E' childId, 'B' parentId FROM dual UNION ALL
SELECT 'F' childId, 'C' parentId FROM dual UNION ALL
SELECT 'G' childId, 'C' parentId FROM dual UNION ALL
SELECT 'H' childId, 'F' parentId FROM dual UNION ALL
SELECT 'I' childId, 'H' parentId FROM dual
)

childId и parentId - некие строковые идентификаторы.

Часть элементов из таблицы b имеют явно указанные лейблы (таблица a). Если лейбл явно не указан, то берется родительский. В итоге должно получиться:

childId label
----------------
A a
B b
C a
D b
E b
F f
G a
H f
I f
5 окт 11, 11:43    [11386677]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в дереве  [new]
AmKad
Member

Откуда:
Сообщений: 5222
userrrr,

WITH a AS
(
SELECT 'A' childId, 'a' label FROM dual UNION ALL
SELECT 'B' childId, 'b' label FROM dual UNION ALL
SELECT 'F' childId, 'f' label FROM dual 
),

b AS
(
SELECT 'A' childId, null parentId FROM dual UNION ALL
SELECT 'B' childId, 'A' parentId FROM dual UNION ALL
SELECT 'C' childId, 'A' parentId FROM dual UNION ALL
SELECT 'D' childId, 'B' parentId FROM dual UNION ALL
SELECT 'E' childId, 'B' parentId FROM dual UNION ALL
SELECT 'F' childId, 'C' parentId FROM dual UNION ALL
SELECT 'G' childId, 'C' parentId FROM dual UNION ALL
SELECT 'H' childId, 'F' parentId FROM dual UNION ALL
SELECT 'I' childId, 'H' parentId FROM dual
)
select b.childid, regexp_substr(sys_connect_by_path(a.label, ','), '([^,])*[,]*$', 1, 1, 'c',1) sc
from a, b 
where b.childid = a.childid(+)
start with b.parentid is null
connect by prior b.childid = b.parentid 
order by 1;

CHILDID SC                  
------- --------------------
A       a                   
B       b                   
C       a                   
D       b                   
E       b                   
F       f                   
G       a                   
H       f                   
I       f                   

9 rows selected.
5 окт 11, 12:01    [11386843]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в дереве  [new]
userrrr
Guest
AmKad, спасибо огромное!

regexp_substr(sys_connect_by_path(a.label, ','), '([^,])*[,]*$', 1, 1, 'c',1)

Это уже что-то выше моего понимания... Просто скопирую, спасибо!
5 окт 11, 12:08    [11386890]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в дереве  [new]
AmKad
Member

Откуда:
Сообщений: 5222
userrrr
AmKad, спасибо огромное!

regexp_substr(sys_connect_by_path(a.label, ','), '([^,])*[,]*$', 1, 1, 'c',1)

Это уже что-то выше моего понимания... Просто скопирую, спасибо!

Главное, чтобы это не было выше твоей версии.
5 окт 11, 12:10    [11386912]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в дереве  [new]
userrrr
Guest
AmKad
userrrr
AmKad, спасибо огромное!

regexp_substr(sys_connect_by_path(a.label, ','), '([^,])*[,]*$', 1, 1, 'c',1)

Это уже что-то выше моего понимания... Просто скопирую, спасибо!

Главное, чтобы это не было выше твоей версии.


:D

10-ка схвала, не поперхнулась
5 окт 11, 12:13    [11386932]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в дереве  [new]
AmKad
Member

Откуда:
Сообщений: 5222
userrrr
AmKad
userrrr
AmKad, спасибо огромное!

regexp_substr(sys_connect_by_path(a.label, ','), '([^,])*[,]*$', 1, 1, 'c',1)

Это уже что-то выше моего понимания... Просто скопирую, спасибо!

Главное, чтобы это не было выше твоей версии.
10-ка схвала, не поперхнулась

Ничего не путаешь?
Oracle® Database SQL Reference 10g Release 2 (10.2) REGEXP_SUBSTR
5 окт 11, 12:16    [11386973]     Ответить | Цитировать Сообщить модератору
 Re: Поиск в дереве  [new]
userrrr
Guest
AmKad
userrrr
пропущено...
10-ка схвала, не поперхнулась

Ничего не путаешь?
Oracle® Database SQL Reference 10g Release 2 (10.2) REGEXP_SUBSTR


Упс, и правда путаю. Тут Oracle Database 11g Enterprise Edition Release 11.1.0.7.0
5 окт 11, 13:48    [11387891]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить