获取层次结构列中缺少的节点

时间:2013-10-24 07:28:13

标签: sql oracle oracle11g

我有一个包含层次结构列的表,其中包含以冒号分隔的数字,以及当前节点及其父节点的数量:

id = '3:234:657:978' 
currNode = 978
parent = 657 

我还有一个查询,它返回其他表中的id和其他一些列,但是缺少一些链接,例如返回2行,一行id为3:234,另一行id {{ 1}}。我需要3:234:567:890 id的行来形成层次结构,但不会返回。

我如何加入表,以便获取缺少的节点(id以外的字段为NULL),但只有缺少的节点(不包括形成层次结构所不需要的节点,例如在树的下面)返回结果)?

编辑: 样本数据:

3:234:567

期望的结果(id作为查询的参数给出,这里它等于'3'):

CREATE TABLE ids (
id VARCHAR(100)
, currNode INT PRIMARY KEY
, parent INT
, name VARCHAR(50)
);

CREATE TABLE someotherdata (
data VARCHAR(10)
, currnode INT
);

INSERT ALL 
INTO ids(id, currnode, parent, name)
VALUES('3', 3, NULL, 'Node1')
INTO ids(id, currnode, parent, name)
VALUES('3:4', 4, 3, 'Node2')
INTO ids(id, currnode, parent, name)
VALUES('3:4:5', 5, 4, 'Node3')
INTO ids(id, currnode, parent, name)
VALUES('3:4:5:6', 6, 5, 'Node4')
INTO ids(id, currnode, parent, name)
VALUES('3:4:5:6:7', 7, 6, 'Node5')
SELECT * FROM dual; COMMIT;

INSERT ALL
INTO someotherdata (name, id)
VALUES('data1', '3:4')
INTO someotherdata (name, id)
VALUES('data2', '3:4:5:6')
SELECT * FROM dual; COMMIT;

(3:4:5:6:7被排除在结果之外,因为不需要形成具有返回数据的记录的层次结构)

1 个答案:

答案 0 :(得分:2)

这不太好。但似乎有效:

SELECT it.id, it.name, ost.data
FROM
(SELECT DISTINCT t.id, t.name
FROM ids t JOIN someotherdata st
 ON instr(':'||st.currnode||':', ':'||t.currnode||':') >0) it LEFT JOIN someotherdata ost
ON it.id = ost.currnode

修改确定,这样更好:

select distinct t.id, t.name, st.data
from ids t left outer join someotherdata st on t.id = st.currnode
start with t.id in (select ist.currnode from someotherdata ist)
connect by prior t.parent = t.currnode
order by t.id

Here is a sqlfiddle demo