Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 как оставить в дереве только нужые узлы?  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
Elic
Member

Откуда:
Сообщений: 30023
dibang
Вопрос как можно оставить в дереве из tsprav только те ветви, которые содержат fk_spravid из второй таблицы.
Вырази свою мысль яснее.
Пока это звучит как банальный недеревянный (2 dmidek - Картинка с другого сайта.) join.
22 янв 07, 17:07    [3676433]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15490
Elic
dibang
Вопрос как можно оставить в дереве из tsprav только те ветви, которые содержат fk_spravid из второй таблицы.
Вырази свою мысль яснее.
Пока это звучит как банальный недеревянный (2 dmidek - Картинка с другого сайта.) join.

+ которого восьмые (вроде.. или только седьмые?) деревянные дрова надух не поддерживали
22 янв 07, 17:13    [3676471]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
Дубовая голова
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]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Я может чего-то не понимаю, чем Вас не устраивает
start with fk_spravid in (select from справочник)
?
22 янв 07, 17:47    [3676723]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
Elic
Member

Откуда:
Сообщений: 30023
Дубовая голова
Ничего более изящного в голову не пришло, sorry:
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

Jannny
Я может чего-то не понимаю, чем Вас не устраивает
start with fk_spravid in (select from справочник)
:) Сколько строк в справочнике, а сколько в результате ?
22 янв 07, 18:00    [3676821]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
Дубовая голова
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]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Elic
Jannny
Я может чего-то не понимаю, чем Вас не устраивает
start with fk_spravid in (select from справочник)
:) Сколько строк в справочнике, а сколько в результате ?
Не особо понимаю, а в чем проблема? Или это ты про опечатку (естественно коннект по деревянной табличке):
start with fk_id in (select from справочник)

PS: вполне возможно продолжаю тупить :)
22 янв 07, 18:09    [3676872]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
Дубовая голова
Guest
Jannny
Не особо понимаю, а в чем проблема? Или это ты про опечатку (естественно коннект по деревянной табличке):


Ну ты прикинь - автору нужно вытащить ветки, заканчивающиеся на узле, входящем в другую таблицу. Если таких несколько - то на самом нижнем узле ветки (судя по посту).
А ты прелагаешь с них начать и идти вниз по дереву, забыв о том, что наверху. ;)
22 янв 07, 18:14    [3676891]     Ответить | Цитировать Сообщить модератору
 Re: как оставить в дереве только нужые узлы?  [new]
Elic
Member

Откуда:
Сообщений: 30023
Jannny
Elic
Jannny
Я может чего-то не понимаю, чем Вас не устраивает
start with fk_spravid in (select from справочник)
:) Сколько строк в справочнике, а сколько в результате ?
Не особо понимаю, а в чем проблема? Или это ты про опечатку (естественно коннект по деревянной табличке):
start with fk_id in (select from справочник)
Я не совсем удачно сформулировал. Голова попробовал сформулировать получше.
  • Обратное дерево не-distinct-ивно (решается distinct-ом)
  • Не уверен, но автору требуется древовидность результата (решается дополнительным прямым деревом)
  • 22 янв 07, 18:23    [3676952]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    Jannny
    Member

    Откуда: Спб
    Сообщений: 6424
    Дубовая голова
    автору нужно вытащить ветки, заканчивающиеся на узле
    а где написано, что они должны там именно заканчиваться???
    22 янв 07, 18:29    [3676979]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    Дубовая голова
    Guest
    Jannny
    Дубовая голова
    автору нужно вытащить ветки, заканчивающиеся на узле
    а где написано, что они должны там именно заканчиваться???


    Я же говорю - это догадки, судя по посту. На рельсы не лягу. :)
    Но и в этом случае простой "start with и вниз" отсекает верх веток, т.е. нужно тады делать объединение двух частей деревьев или изгаляться - находить листовые узлы и опять топать наверх
    со всеми вытекающими.
    22 янв 07, 18:36    [3677017]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    Elic
    Member

    Откуда:
    Сообщений: 30023
    Jannny
    Дубовая голова
    автору нужно вытащить ветки, заканчивающиеся на узле
    а где написано, что они должны там именно заканчиваться???
    Мне это сказал опыт использования хрустального шара :)
    22 янв 07, 18:44    [3677059]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    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]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    dibang
    Member

    Откуда:
    Сообщений: 60
    Elic

    Не уверен, но автору требуется древовидность результата (решается дополнительным прямым деревом)

    можно поподробнее, т.к. именно дерево и нужно
    23 янв 07, 11:23    [3679349]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    Jannny
    Member

    Откуда: Спб
    Сообщений: 6424
    dibang
    Elic

    Не уверен, но автору требуется древовидность результата (решается дополнительным прямым деревом)

    можно поподробнее, т.к. именно дерево и нужно
    Это скорее к Вам вопрос, если хотите ответ :) Ребята вон хоть с "шаром", а у меня он в починке...

    dibang
    выдает ошибку
    ORA-01472 cannot use CONNECT BY on view with DISTINCT, GROUP BY...
    Ну в Вашей 8ке так и будет, надо избавляться от джоинов внутри дерева...
    23 янв 07, 11:34    [3679452]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    Elic
    Member

    Откуда:
    Сообщений: 30023
    dibang
    ORA-01472 cannot use CONNECT BY on view with DISTINCT, GROUP BY...
    Да уж, эти ограничения 8-ки.
    Тогда первоначальный вариант "головы" либо
    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
    
    Но не уверен, что древовидный порядок сохранится.

    Jannny
    Ну в Вашей 8ке так и будет, надо избавляться от джоинов внутри дерева...
    От группировки distinct-ом, которая необходима - парадокс :)
    23 янв 07, 11:39    [3679491]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    dibang
    Member

    Откуда:
    Сообщений: 60
    Спасибо, буду пробовать
    23 янв 07, 11:40    [3679509]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    Jannny
    Member

    Откуда: Спб
    Сообщений: 6424
    Elic
    Jannny
    Ну в Вашей 8ке так и будет, надо избавляться от джоинов внутри дерева...
    От группировки distinct-ом, которая необходима - парадокс :)
    Спорить не буду(проверять все равно негде), но на 8ке ИМХО и без него свалится с той же ошибкой.
    23 янв 07, 11:45    [3679551]     Ответить | Цитировать Сообщить модератору
     Re: как оставить в дереве только нужые узлы?  [new]
    Elic
    Member

    Откуда:
    Сообщений: 30023
    Jannny
    Спорить не буду(проверять все равно негде), но на 8ке ИМХО и без него свалится с той же ошибкой.
    Похоже ты права (по крайней мере, на семёрке это так). Значит до 9-ки нельзя "деревить" по дереву или по другому чуть сложному запросу :)
    23 янв 07, 11:54    [3679631]     Ответить | Цитировать Сообщить модератору
    Все форумы / Oracle Ответить