помогите составить запрос

копосов нв
Дата: 27.02.2007 16:24:17
запрос
SELECT     f_activity , f_name
      FROM objectcheck
     WHERE LEVEL IN (1, 2)
START WITH f_idparent = 0
CONNECT BY PRIOR f_id_objectcheck = f_idparent
работа с деревом
необходимо описать условие вывода значения для поля f_activity. Если у родителя значение f_activity = 0 тогда значение поля f_activity для всех дочерних тоже 0.


-----------------------------------------------------------
Информация – это то, чем я пользуюсь для принятия решений.

Бернерс-Ли
копосов нв
Дата: 27.02.2007 16:25:36
пробовал через lag() over() просит сортировку в over, а мне как бы надо уже для существующего набора данных.
-----------------------------------------------------------
Информация – это то, чем я пользуюсь для принятия решений.

Бернерс-Ли
orawish
Дата: 27.02.2007 16:35:24
Вариации на тему изучения sys_connect_by_path на предмет содержания /0/
dmidek
Дата: 27.02.2007 16:37:59
Я может не до конца понял, но вот что у меня вышло на десятке.
(Если sal папы 5000, то и у детей зарплата 5000)

SQL> select q.empno, decode(e2.sal, 5000, 5000, q.sal)
  2    from emp e2,
  3         (select connect_by_root(empno) cbr, e.*
  4            from emp e
  5          connect by prior empno = mgr
  6           start with mgr is null) q
  7   where e2.empno = q.cbr
  8  /

EMPNO DECODE(E2.SAL,5000,5000,Q.SAL)
----- ------------------------------
 7839                           5000
 7566                           5000
 7788                           5000
 7876                           5000
 7902                           5000
 7369                           5000
 7698                           5000
 7499                           5000
 7521                           5000
 7654                           5000
 7844                           5000
 7900                           5000
 7782                           5000
 7934                           5000

14 rows selected

SQL> 
копосов нв
Дата: 27.02.2007 17:03:18
беда Oracle 8/1/6
функции не доступны
-----------------------------------------------------------
Информация – это то, чем я пользуюсь для принятия решений.

Бернерс-Ли
orawish
Дата: 27.02.2007 17:04:39
Вот такая деревяшка клеит чиселки, на каждом уровне выбирая большее из детальки и всех её мастеров
with t as (select a.*,substr(empno,3,1) k from emp a)
select ename,empno
,sys_connect_by_path(k,'/') src
,sys_connect_by_path(greatest(k,
 nvl(substr(prior sys_connect_by_path(k,'/')
       ,1+instr(prior sys_connect_by_path(k,'/'),'/',-1)),k))
       ,'/') res
from t
connect by mgr = prior empno
start with mgr is null
Volder
Дата: 27.02.2007 19:38:11
копосов нв

необходимо описать условие вывода значения для поля f_activity. Если у родителя значение f_activity = 0 тогда значение поля f_activity для всех дочерних тоже 0.


with t as (select 1 id, 10 value, null id_parent from dual union all
           select 2 id, 20 value, 1 id_parent from dual union all
           select 3 id, 0 value, 1 id_parent from dual union all
           select 4 id, 40 value, 2 id_parent from dual union all
           select 5 id, 50 value, 3 id_parent from dual union all
           select 6 id, 60 value, 3 id_parent from dual union all
           select 7 id, 70 value, 5 id_parent from dual union all
           select 8 id, 80 value, 2 id_parent from dual union all
           select 9 id, 90 value, 7 id_parent from dual)
--           
select id,
       id_parent,
       value,
       lev,
       case when decode(pos, -1, lev, pos) < lev 
        then 0
        else value
       end value_new
  from (select id, value,
               instr(translate(replace(sys_connect_by_path(value, ','),',0,',',x,'),' 1234567890 ',' '),'x') - 1 pos,
               id_parent,
               level lev
        from t
         start with id_parent is null
         connect by id_parent = prior id)
Бабичев Сергей
Дата: 28.02.2007 06:32:35
orawish
Вот такая деревяшка клеит чиселки, на каждом уровне выбирая большее из детальки и всех её мастеров
with t as (select a.*,substr(empno,3,1) k from emp a)
select ename,empno
,sys_connect_by_path(k,'/') src
,sys_connect_by_path(greatest(k,
 nvl(substr(prior sys_connect_by_path(k,'/')
       ,1+instr(prior sys_connect_by_path(k,'/'),'/',-1)),k))
       ,'/') res
from t
connect by mgr = prior empno
start with mgr is null

Вот только 8-ке ты этого не объяснишь...
копосов нв
беда Oracle 8/1/6
функции не доступны
orawish
Дата: 28.02.2007 12:28:50
Бабичев Сергей
..Вот только 8-ке ты этого не объяснишь...
копосов нв
беда Oracle 8/1/6
функции не доступны

Это да.. (ведь, обошел таки автор на кнопке )
Аналог sys_connect_by_path делали с помощью серверной функции, которая проходила
по дереву (хоть вперед а хоть и взад:) и клеила (в данном примере-анализировала) ветки.
Получившееся поле, кстати, могло служить и для сортировки а-ля SIBLINGS
копосов нв
Дата: 28.02.2007 16:34:07
orawish
Вариации на тему изучения sys_connect_by_path на предмет содержания /0/


вот что получилось
SELECT     f_id_objectcheck, LEVEL, f_cod_obj,f_idparent, 
           decode(instr(HIERARCHY.BRANCHNAME(level,f_activity,'\'),0),0,1,0) f_activity,
           (DECODE (LEVEL, 2, f_cod_obj || ' - ' || f_name, f_name)
           ) AS f_name_full
      FROM objectcheck
     WHERE LEVEL IN (1, 2)
START WITH f_idparent = 0
CONNECT BY PRIOR f_id_objectcheck = f_idparent
уточню что Oracle 8.1.6 и HIERARCHY это пакет как замена фун-ям в 9