Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Oracle |
![]() ![]() |
dibang Member Откуда: Сообщений: 60 |
oracle 8.1.7.0 есть табличка с полями fk_id, fk_owner - tsprav, и есть таблица, имеющее поле fk_spravid(ссылка на tsprav.fk_id). Вопрос как можно оставить в дереве из tsprav только те ветви, которые содержат fk_spravid из второй таблицы. Поиском пользовался, но время поджимает, и там для 9i и выше... |
22 янв 07, 16:50 [3676302] Ответить | Цитировать Сообщить модератору |
dmidek Member Откуда: Киев - Дортмунд Сообщений: 117468 |
ИМХО Вам нужно что то в этом духе SQL> select empno, ename, sal, comm, job, mgr, e.deptno
2 from (select *
3 from scott.emp
4 connect by prior empno = mgr
5 start with mgr is null) e,
6 scott.dept d
7 where e.deptno = d.deptno
8 /
EMPNO ENAME SAL COMM JOB MGR DEPTNO
----- ---------- --------- --------- --------- ----- ------
7839 KING 5000,00 PRESIDENT 10
7566 JONES 2975,00 MANAGER 7839 20
7788 SCOTT 3000,00 ANALYST 7566 20
7876 ADAMS 1100,00 CLERK 7788 20
7902 FORD 3000,00 ANALYST 7566 20
7369 SMITH 800,00 CLERK 7902 20
7698 BLAKE 2850,00 MANAGER 7839 30
7499 ALLEN 1600,00 300,00 SALESMAN 7698 30
7521 WARD 1250,00 500,00 SALESMAN 7698 30
7654 MARTIN 1250,00 1400,00 SALESMAN 7698 30
7844 TURNER 1500,00 0,00 SALESMAN 7698 30
7900 JAMES 950,00 CLERK 7698 30
7782 CLARK 2450,00 MANAGER 7839 10
7934 MILLER 1300,00 CLERK 7782 10
14 rows selected
SQL>
|
22 янв 07, 17:05 [3676415] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30023 |
Пока это звучит как банальный недеревянный (2 dmidek - ![]() |
||
22 янв 07, 17:07 [3676433] Ответить | Цитировать Сообщить модератору |
orawish Member Откуда: Гадюкино-2 (City) Сообщений: 15490 |
+ которого восьмые (вроде.. или только седьмые?) деревянные дрова надух не поддерживали |
||||
22 янв 07, 17:13 [3676471] Ответить | Цитировать Сообщить модератору |
dibang Member Откуда: Сообщений: 60 |
Ситуация следущая : нужно по Fk_spravid(id листьев дерева из tsprav) восстановить путь до корня(какого либо определенного родителя). Например имеем дерево:1 1.1 1.1.1 1.1.2 1.2 1.2.1 1.3 2 2.1 2.1.1 2.1.2 2.1.3 2.2 И допустим в другой табличке имее след fk_spravid 2.2 1.1.1 1.3 Из первоначального дерева доллжно остаться 1 1.1 1.1.1 1.3 2 2.2 Надеюсь, пример получился наглядным, словами не получается сформулировать.... ЗАранее, спасибо |
22 янв 07, 17:22 [3676562] Ответить | Цитировать Сообщить модератору |
Дубовая голова
Guest |
Ничего более изящного в голову не пришло, sorry:SQL> select ename, deptno from emp 2 start with mgr is null 3 connect by prior empno = mgr; ENAME DEPTNO ---------- ---------- KING JONES SCOTT 20 ADAMS FORD SMITH BLAKE 30 ALLEN WARD MARTIN 30 TURNER JAMES CLARK MILLER 14 rows selected. SQL> select lpad('-',lvl,'-') || '>' || t1.ename 2 from 3 (select ename, empno, level lvl 4 from emp start with mgr is null 5 connect by prior empno = mgr) t1 6 , 7 (select unique empno 8 from emp start with deptno in (select deptno from dept) 9 connect by prior mgr = empno) t2 10 where t1.empno = t2.empno 11 / LPAD('-',LVL,'-')||'>'||T1.ENAME -------------------------------------------------------------------------------- ->KING -->JONES --->SCOTT -->BLAKE --->MARTIN |
22 янв 07, 17:42 [3676694] Ответить | Цитировать Сообщить модератору |
Jannny Member Откуда: Спб Сообщений: 6424 |
Я может чего-то не понимаю, чем Вас не устраивает start with fk_spravid in (select from справочник)? |
22 янв 07, 17:47 [3676723] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30023 |
select lpad('-',level,'-') || '>' || ename from ( select unique empno, mgr, empno from emp start with deptno in (select deptno from dept) connect by empno = prior mgr ) start with mgr is null connect by mgr = prior empno
|
||||
22 янв 07, 18:00 [3676821] Ответить | Цитировать Сообщить модератору |
Дубовая голова
Guest |
[quot Elic]select lpad('-',level,'-') || '>' || ename from ( select unique empno, mgr, empno from emp start with deptno in (select deptno from dept) connect by empno = prior mgr ) start with mgr is null connect by mgr = prior empno Угу, точно. Туплю... :D |
22 янв 07, 18:06 [3676852] Ответить | Цитировать Сообщить модератору |
Jannny Member Откуда: Спб Сообщений: 6424 |
start with fk_id in (select from справочник) PS: вполне возможно продолжаю тупить :) |
||||
22 янв 07, 18:09 [3676872] Ответить | Цитировать Сообщить модератору |
Дубовая голова
Guest |
Ну ты прикинь - автору нужно вытащить ветки, заканчивающиеся на узле, входящем в другую таблицу. Если таких несколько - то на самом нижнем узле ветки (судя по посту). А ты прелагаешь с них начать и идти вниз по дереву, забыв о том, что наверху. ;) |
||
22 янв 07, 18:14 [3676891] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30023 |
|
||||||
22 янв 07, 18:23 [3676952] Ответить | Цитировать Сообщить модератору |
Jannny Member Откуда: Спб Сообщений: 6424 |
|
||
22 янв 07, 18:29 [3676979] Ответить | Цитировать Сообщить модератору |
Дубовая голова
Guest |
Я же говорю - это догадки, судя по посту. На рельсы не лягу. :) Но и в этом случае простой "start with и вниз" отсекает верх веток, т.е. нужно тады делать объединение двух частей деревьев или изгаляться - находить листовые узлы и опять топать наверх со всеми вытекающими. |
||||
22 янв 07, 18:36 [3677017] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30023 |
|
||||
22 янв 07, 18:44 [3677059] Ответить | Цитировать Сообщить модератору |
dibang Member Откуда: Сообщений: 60 |
select lpad('-',level,'-') || '>' || ename from ( select unique empno, mgr, ename from *emp start with deptno in (select deptno from dept) connect by empno = prior mgr ) start with mgr is null connect by mgr = prior empnoвыдает ошибку ORA-01472 cannot use CONNECT BY on view with DISTINCT, GROUP BY... |
23 янв 07, 08:49 [3678339] Ответить | Цитировать Сообщить модератору |
dibang Member Откуда: Сообщений: 60 |
можно поподробнее, т.к. именно дерево и нужно |
||
23 янв 07, 11:23 [3679349] Ответить | Цитировать Сообщить модератору |
Jannny Member Откуда: Спб Сообщений: 6424 |
![]()
|
||||||
23 янв 07, 11:34 [3679452] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30023 |
Тогда первоначальный вариант "головы" либо select lpad('-',level,'-') || '>' || ename from emp where empno in ( select empno from emp start with deptno in (select deptno from dept) connect by empno = prior mgr ) start with mgr is null connect by mgr = prior empnoНо не уверен, что древовидный порядок сохранится.
|
||||
23 янв 07, 11:39 [3679491] Ответить | Цитировать Сообщить модератору |
dibang Member Откуда: Сообщений: 60 |
Спасибо, буду пробовать |
23 янв 07, 11:40 [3679509] Ответить | Цитировать Сообщить модератору |
Jannny Member Откуда: Спб Сообщений: 6424 |
|
||||
23 янв 07, 11:45 [3679551] Ответить | Цитировать Сообщить модератору |
Elic Member Откуда: Сообщений: 30023 |
|
||
23 янв 07, 11:54 [3679631] Ответить | Цитировать Сообщить модератору |
Все форумы / Oracle | ![]() |