0

以下のような階層テーブルがあります。FLAG値に基づいて属性を設定したいCODE。可能なコード値は、、、Rおよびです。は、対応するコード値が親の値と一致する場合に設定されます。NRRNNFFLAG'Y'

if parent.code = 'R' and child.code = 'R' then flag = 'Y'
if parent.code = 'NR' and child.code = 'NR' then flag = 'Y'
if parent.code = 'RNR' and child.code = 'R' or 'NR', then flag = 'Y'.

ここに私のテーブルがあります:

create table My_BOM(assign_Id varchar2(50) not null primary key, 
parent_assign_Id varchar2(50) references My_BOM(assign_Id), 
code varchar2(50) not null, 
flag varchar2(1) default 'Y');


insert into my_bom values ('T1',null,'RNR','Y');
insert into my_bom values ('T2','T1','R','Y');
insert into my_bom values ('T3','T2','NR','Y');
insert into my_bom values ('T4','T3','R','Y');
insert into my_bom values ('T5','T1','NF','Y');
insert into my_bom values ('T6','T5','R','Y');
insert into my_bom values ('T7','T1','NR','Y');
insert into my_bom values ('T8','T7','RNR','Y');
insert into my_bom values ('T9','T8','R','Y');
insert into my_bom values ('T10','T1','RNR','Y');

フラグを設定するには?これは私が試した方法ですが、このクエリは、チェーンが途中で壊れているため、不要な T9 レコードも返しますCODE。したがって、T9 は結果の一部として表示されません。

select connect_by_root(assign_Id), assign_Id desc_assign_Id, code, flag
from my_bom
where
--exists (select null from my_bom mb where mb.parent_assign_Id = prior my_bom.assign_Id 
--connect by mb.parent_assign_Id = prior mb.assign_Id) and 
DECODE( CODE,
  'R', 'R', 'NR', 'NR', 'RNR',
  :bind_var, NULL) = PRIOR DECODE( CODE,
  'R', 'R', 'NR', 'NR', 'RNR',
  :bind_var, NULL)
  start with parent_assign_Id is null
connect by parent_assign_Id = prior assign_Id
order by desc_assign_Id;

"bind_var"'R'または _'NR'

これがSQLフィドルです:http://sqlfiddle.com/#!4/009ad/2/0

4

1 に答える 1

1

私が正しく理解しているかどうかはわかりませんが、条件をconnect by句に移動して、階層全体に沿って矛盾を除外することができます (最後の親子のペアに対して)。

select connect_by_root(assign_Id), assign_Id desc_assign_Id, code, flag
from my_bom
connect by parent_assign_Id = prior assign_Id
and DECODE( CODE,
  'R', 'R', 'NR', 'NR', 'RNR',
  :bind_var, NULL) = PRIOR DECODE( CODE,
  'R', 'R', 'NR', 'NR', 'RNR',
  :bind_var, NULL)
start with parent_assign_Id is null
order by desc_assign_Id;

where parent_assign_Id is not nullルートが必要ない場合は、次を追加することもできます。

select connect_by_root(assign_Id), assign_Id desc_assign_Id, code, flag
from my_bom
where parent_assign_Id is not null    
connect by parent_assign_Id = prior assign_Id
and DECODE( CODE,
  'R', 'R', 'NR', 'NR', 'RNR',
  :bind_var, NULL) = PRIOR DECODE( CODE,
  'R', 'R', 'NR', 'NR', 'RNR',
  :bind_var, NULL)
start with parent_assign_Id is null
order by desc_assign_Id;

複合connect by条件は Oracle 10g で動作するはずです。私は 11g でのみテストしました

于 2013-05-21T18:17:52.567 に答える