Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запросик с деревом / 12 сообщений из 12, страница 1 из 1
23.10.2018, 14:24
    #39721462
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
Извиняюсь, что-то совсем отупел, подскажите как:

Есть дерево:
Код: plsql
1.
2.
3.
4.
5.
6.
 SELECT ID, TREE_NAME, PARENT_ID  FROM MY_TREE; 
1	a	NULL
2	b	NULL
3	c	1
4	d	1
5	e	4


и табличка:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
 SELECT ID, TAB_TREE_ID, TAB_NAME FROM MY_TABLE;
1	3	aaa
2	5	bbb
3	5	ccc
4	5	ddd
5	5	eee
6	5	fff


Хочется построить запрос, который вернет строки из второй таблички, дополненные колонкой с идентификатором узла дерева, если строка относится к одному из предков...
Короче, так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 SELECT ???;
1	3	aaa	3
1	3	aaa	1

2	5	bbb	5
2	5	bbb	4
2	5	bbb	1

3	5	ccc	5
3	5	ccc	4
3	5	ccc	1

и т.д.


т.е. что-то типа такого:
Код: plsql
1.
2.
3.
4.
 SELECT MY_TABLE.*, TREE.ID
FROM MY_TABLE, MY_TREE
START WITH MY_TREE.ID = MY_TABLE.TAB_TREE_ID
CONNECT BY PRIOR MY_TREE.PARENT_ID = MY_TREE.ID


только так не правильно.
Что-то я совсем нюх потерял.
Подскажите, пожалуйста, как правильно
...
Рейтинг: 0 / 0
23.10.2018, 14:25
    #39721463
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
Код: plsql
1.
2.
3.
4.
SELECT MY_TABLE.*, TREE.ID
FROM MY_TABLE, MY_TREE
START WITH MY_TREE.ID = MY_TABLE.TAB_TREE_ID
CONNECT BY PRIOR MY_TREE.PARENT_ID = MY_TREE.ID
...
Рейтинг: 0 / 0
23.10.2018, 14:31
    #39721465
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
KOT MATPOCKuH,

lateral
...
Рейтинг: 0 / 0
23.10.2018, 14:42
    #39721474
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
-2-KOT MATPOCKuH,
lateral
Переведи
...
Рейтинг: 0 / 0
23.10.2018, 14:45
    #39721477
MazoHist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
А sys_connect_by_path не хватит? на крайний случай можно его вывод распарсить
...
Рейтинг: 0 / 0
23.10.2018, 15:07
    #39721485
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
Сам нашел:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT	MY_TABLE.*, ttt.ID
FROM		MY_TABLE
	,	(SELECT	MY_TREE.ID		ID
		,	CONNECT_BY_ROOT ID	CONNECT_ID
		FROM	MY_TREE
		CONNECT BY PRIOR MY_TREE.PARENT_ID = MY_TREE.ID
		) ttt
WHERE	MY_TREE.ID = ttt.CONNECT_ID
...
Рейтинг: 0 / 0
23.10.2018, 15:08
    #39721487
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
опечатка. Так нада:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT	MY_TABLE.*, ttt.ID
FROM		MY_TABLE
	,	(SELECT	MY_TREE.ID		ID
		,	CONNECT_BY_ROOT ID	CONNECT_ID
		FROM	MY_TREE
		CONNECT BY PRIOR MY_TREE.PARENT_ID = MY_TREE.ID
		) ttt
WHERE	MY_TABLE.ID = ttt.CONNECT_ID
...
Рейтинг: 0 / 0
23.10.2018, 15:13
    #39721492
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
Хотя сам я не люблю такие запросы - плодить картезиан и потом его схлопывать...
Как-то не оптимально, хотя для моих нужд и достаточно.

Еще есть варианты решения?
...
Рейтинг: 0 / 0
23.10.2018, 15:24
    #39721501
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
with
  my_wish(ID, TAB_TREE_ID, TAB_NAME, predecessor_id, ord)
as( select ID, TAB_TREE_ID, TAB_NAME, TAB_TREE_ID, 0
      from my_table
     union all 
    select my_wish.ID, my_wish.TAB_TREE_ID, my_wish.TAB_NAME, my_tree.PARENT_ID, my_wish.ord+1
      from my_wish, my_tree
     where my_wish.predecessor_id = my_tree.id
       and my_tree.PARENT_ID is not null
)
select ID, TAB_TREE_ID, TAB_NAME, predecessor_id 
  from my_wish
 order by id, ord
...
Рейтинг: 0 / 0
23.10.2018, 15:32
    #39721506
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
andrey_anonymous,

Оптимальнее, но...
Жесть! Так использовать WITH !!!
(не проверял, но поверю, что так можно)
...
Рейтинг: 0 / 0
23.10.2018, 15:36
    #39721509
KOT MATPOCKuH
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
andrey_anonymous,

Оптимальнее, но...
Жесть! Так использовать WITH !!!
(не проверял, но поверю, что так можно)!
...
Рейтинг: 0 / 0
23.10.2018, 15:45
    #39721517
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик с деревом
KOT MATPOCKuHОптимальнее, но...
Котёнок, учите матчасть.
И - просто совет - избегайте употреблять малознакомые слова вроде "оптимальнее" или "картезиан".
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запросик с деревом / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]