1

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

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

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

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

编辑:样本数据:

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;

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

id       name     data

3        Node1    NULL
3:4      Node2    data1
3:4:5    Node3    NULL
3:4:5:6  Node4    data2

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

4

1 回答 1

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

这是一个 sqlfiddle 演示

于 2013-10-24T09:00:38.403 回答