An Answer to #2
April 26th, 2006 — ddelmoliI’m not really satisfied with this answer, but so far this is the best I can do.
- It attempts to walk the path from top to bottom, starting at the root
- It attempts to validate each step on the path, but it does it pretty crudely in my opinion
- At least the code is pretty easy to understand
SQL> select account_id
2 from
3 (
4 select account_id, sys_connect_by_path(a.account_name,’.') account_path
5 from account a
6 start with a.account_name =
7 substr(‘sys.all_apply_progress.apply_name’,1,
8 instr(‘sys.all_apply_progress.apply_name’,’.’)-1)
9 and a.parent_account_id is null
10 connect by prior a.account_id = a.parent_account_id
11 and instr(‘.’||’sys.all_apply_progress.apply_name’||’.',’.'||a.account_name||’.') > 0
12 )
13* where account_path = ‘.’||’sys.all_apply_progress.apply_name’
SQL> /
ACCOUNT_ID
———-
10100
Execution Plan
———————————————————-
SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=2015)
VIEW (Cost=1 Card=1 Bytes=2015)
CONNECT BY (WITH FILTERING)
NESTED LOOPS
TABLE ACCESS (BY INDEX ROWID) OF ‘ACCOUNT’ (Cost=2 Card=1 Bytes=15)
INDEX (RANGE SCAN) OF ‘ACCOUNT_IK_NAME’ (NON-UNIQUE) (Cost=1 Card=4)
TABLE ACCESS (BY USER ROWID) OF ‘ACCOUNT’
NESTED LOOPS
BUFFER (SORT)
CONNECT BY PUMP
TABLE ACCESS (BY INDEX ROWID) OF ‘ACCOUNT’ (Cost=1 Card=1 Bytes=19)
INDEX (RANGE SCAN) OF ‘ACCOUNT_FK_PARENT’ (NON-UNIQUE) (Cost=1 Card=12)
Statistics
———————————————————-
0 recursive calls
0 db block gets
24 consistent gets
0 physical reads
0 redo size
213 bytes sent via SQL*Net to client
234 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
7 sorts (memory)
0 sorts (disk)
1 rows processed