2014-01-31 20 views
2

我需要informix 11.50層次結構數據SQL的一點幫助。我有以下表格:Informix 11.50分層SQL

create table cont_reln (
    contact char(10), 
    relation_type char(1), 
    related_to char(10)); 

contact | relation_type | related_to 
1000  CH    2001 
1000  CH    2002 
1000  CH    2003 
2001  CH    3001 
2001  CH    3002 
2002  CH    3003 
2003  CH    3004 
3004  CH    4001 
4001  CH    5001 

我寫兩個sql語句,可以採取接觸,找出所有的家長,和所有的孩子:

-- Get the children 
SELECT contact, related_to, LEVEL 
    FROM cont_reln 
     START WITH contact = '?' 
     CONNECT BY NOCYCLE PRIOR related_to = contact 
    ORDER SIBLINGS BY related_to; 

-- Get the parents 
SELECT contact, related_to, LEVEL  
    FROM cont_reln 
    START WITH related_to = '?'  
     CONNECT BY NOCYCLE PRIOR contact = related_to 
    ORDER SIBLINGS BY contact; 

每個查詢返回的內容我在之後,但我不確定如何將它們結合起來,以便在我開始使用任何聯繫人號碼時獲得以下輸出...因此,不管是什麼'?'是,如果它在這個層次的地方,該數據集將返回完全相同如下:

contact | relation_type | related_to 
NULL  NULL    1000 
1000  CH    2001 
2001  CH    3001 
2001  CH    3002 
1000  CH    2002 
2002  CH    3003 
2003  CH    3004 
3004  CH    4001 
4001  CH    5001 

我知道的第一行(與空值)都必須返回一次作爲SP單獨的硬編碼回報我知道根節點,但從第2行開始 - >我不知道該怎麼做。

任何想法?

**編輯** 查找父項的查詢不正確 - 修復。

回答

1

好的,我想通了。

在一個查詢中無法做到這一點,但在存儲過程中這是微不足道的。

首先,我需要知道根節點(它與組合兩個查詢無關)。

要找到我跑根節點:

SELECT 
    contact 
FROM 
    cont_reln 
WHERE 
    relation_type = 'CH' 
    START WITH related_to = '?' 
    CONNECT BY NOCYCLE 
    PRIOR contact = related_to 
    AND PRIOR related_to != related_to 
ORDER SIBLINGS BY 
    contact 

這是在foreach,並通過虛擬的方式分層查詢返回,我總是知道的最後一個記錄是根。

從那裏,我只是根據根聯繫人ID運行子選擇。

SELECT 
    contact, 
    related_to 
FROM 
    cont_reln 
WHERE 
    relation_type = 'CH' 
    START WITH contact = 'THE RETURNED ROOT NODE ID' 
    CONNECT BY NOCYCLE PRIOR related_to = contact 
ORDER SIBLINGS by 
    related_to