Search notes:

Oracle SQL: start with … connect by example: pruning branches

Create the table

First, a table is created to store the data:
create table prune_test (
  parent  number,
  child   number
);
Github repository oracle-patterns, path: /SQL/select/hierarchical_queries/start-with_connect-by/pruning-branches/create-table.sql

Fill the data

The table is filled with data.
Note: each child starts with the same digits as its parent and adds another digit.
insert into prune_test values (null,   1);
insert into prune_test values (null,   6);
insert into prune_test values (null,   7);

insert into prune_test values (   1,  12);
insert into prune_test values (   1,  14);
insert into prune_test values (   1,  15);

insert into prune_test values (   6,  61);
insert into prune_test values (   6,  63);
insert into prune_test values (   6,  65);
insert into prune_test values (   6,  69);

insert into prune_test values (   7,  71);
insert into prune_test values (   7,  74);

insert into prune_test values (  12, 120);
insert into prune_test values (  12, 124);
insert into prune_test values (  12, 127);

insert into prune_test values (  65, 653);

insert into prune_test values (  71, 712);
insert into prune_test values (  71, 713);
insert into prune_test values (  71, 715);

insert into prune_test values (  74, 744);
insert into prune_test values (  74, 746);
insert into prune_test values (  74, 748);

insert into prune_test values ( 712,7122);
insert into prune_test values ( 712,7125);
insert into prune_test values ( 712,7127);

insert into prune_test values ( 748,7481);
insert into prune_test values ( 748,7483);
insert into prune_test values ( 748,7487);
Github repository oracle-patterns, path: /SQL/select/hierarchical_queries/start-with_connect-by/pruning-branches/insert-data.sql

Select hierarchically and prune some nodes

I want to select the data hierarchically. However, I am not interested in the data below 1 and 71. So, I exclude them in the connect by clause (not in a where clause!).
select
  lpad(' ', 2*level) || child
from
  prune_test
start with
  parent is null
connect by
  prior child = parent and
  parent not in (1, 71)  -- Exclude children below and 71
; 
Github repository oracle-patterns, path: /SQL/select/hierarchical_queries/start-with_connect-by/pruning-branches/select-data.sql
The query returns
  1
  6
    61
    63
    65
      653
    69
  7
    71
    74
      744
      746
      748
	7481
	7483
	7487

Cleaning up

Finally: cleaning up.
drop table prune_test purge;
Github repository oracle-patterns, path: /SQL/select/hierarchical_queries/start-with_connect-by/pruning-branches/clean-up.sql

See also

start with … connect by
http://www.adp-gmbh.ch/ora/data_samples/hierarchic_yahoo.html#show_active

Index