2013-10-24 97 views
1

我有層次列其中包括用冒號分隔的數字,以及當前節點的數量和它的父表:獲取缺少層次柱節點

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

我也有一個查詢返回的ID還有其他一些列,但其中一些鏈接丟失,例如返回2行,一個ID爲3:234,另一個ID爲3:234:567:890。我需要與3:234:567 id行以形成一個層次結構,但它沒有返回。

我該如何加入表格,以便我找到缺少的節點(除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被排除在結果之外,因爲不需要用返回數據的記錄來形成層次結構)

+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

+0

如果id的形式爲樹狀結構,這將不起作用嗎? (例如3:4:5:6:7,但也可能是3:4:10:11和3:1:34等等。關於這個層次結構唯一確定的事情是currnode和id是唯一的。 – kyooryu

+0

@kyooryu,我明白你的意思了,更新我的回答(和sqlfiddle演示) –