with t as ( select '1' id, '-1' parent_id, 'root' title from dual
union all
select '2' id, '-1' parent_id, '一级节点A' title from dual
union all
select '3' id, '-1' parent_id, '一级节点B' title from dual
union all
select '4' id, '-1' parent_id, '一级节点C' title from dual
union all
select '5' id, '2' parent_id, '二级节点A-A' title from dual
union all
select '6' id, '3' parent_id, '二级节点B-A' title from dual
union all
select '7' id, '3' parent_id, '二级节点B-B' title from dual
union all
select '8' id, '3' parent_id, '二级节点B-C' title from dual
union all
select '9' id, '4' parent_id, '二级节点C-A' title from dual
union all
select '10' id, '7' parent_id, '三级节点B-B-A' title from dual
union all
select '11' id, '7' parent_id, '三级节点B-B-B' title from dual
union all
select '12' id, '11' parent_id, '三级节点B-B-B-A' title from dual
union all
select '13' id, '11' parent_id, '三级节点B-B-B-B' title from dual
)
,t2 AS (
SELECT * FROM (SELECT REGEXP_SUBSTR('2,5,7,12,13','[^,]+',1,LEVEL) id FROM DUAL CONNECT BY LEVEL<=100)
WHERE id IS NOT NULL
)
,t3 AS (
SELECT t.*,t2.id t2id FROM t LEFT JOIN t2 ON t.id=t2.id
)
SELECT * FROM t2 WHERE id NOT IN (
SELECT CONNECT_BY_ROOT(id) root_id
FROM t3
WHERE CONNECT_BY_ROOT(id)<>id AND t2id IS NOT NULL
START WITH t2id IS NOT NULL
CONNECT BY PRIOR parent_id = id
);