2010-10-19 148 views
1

我的來源是如下親子關係 - SQL查詢

OSPID  OSPNAME RELATEDOSPID 
100004 LEVEL4 100003 
100003 LEVEL3 100002 
100002 LEVEL2 100001 
100001 LEVEL1 0 
100009 LEVEL4 100008 
100008 LEVEL2 100007 

我需要的結果作爲

L4OSPID L4OSPNAME L3RELATEDID L3OSPNAME L2RELATEDID L2OSPNAME L1RELATEDID L2OSPNAME ROOTNODE 
100004 LEVEL4  100003  LEVEL3  100002  LEVEL2  100001  LEVEL1  0 
100009 LEVEL4  100008  NULL  NULL  LEVEL2  100007  NULL   NULL 

如果缺少之間的任何級別應該把NULL

感謝

+0

是否有總是那些4級(除了丟失的記錄)? – 2010-10-19 12:28:53

+0

Peter:是的,可能有所有4個級別的記錄相關聯,並且也會記錄缺失的鏈接。 – Sreedhar 2010-10-19 12:37:55

+1

您的最後一行指向不存在的'100007'。這是你的樣品錯誤嗎? – 2010-10-19 12:49:08

回答

0

假設只有4個LEVEL,並且您始終想從LEVEL4開始,請查詢

select L4.OSPID as L4OSPID, L4.OSPNAME as L4OPSNAME, 
L4.RELATEDOSPID 
as L3RELATEDID, 

case 
    WHEN L3.OSPNAME = 'LEVEL3' THEN L3.OSPNAME 
    ELSE NULL 
end as L3OSPNAME, 

case 
    WHEN L3.OSPNAME = 'LEVEL3' THEN L3.RELATEDOSPID 
    ELSE NULL 
end as L2RELATEDID, 

case 
    WHEN L3.OSPNAME = 'LEVEL2' THEN L3.OSPNAME 
    WHEN L2.OSPNAME = 'LEVEL2' THEN L2.OSPNAME 
    ELSE NULL 
end as L2OSPNAME, 

case WHEN L3.OSPNAME = 'LEVEL2' THEN L3.RELATEDOSPID 
    WHEN L2.OSPNAME = 'LEVEL2' THEN L2.RELATEDOSPID 
    ELSE NULL 
end 
as L1RELATEDID, 

case 
    WHEN L3.OSPNAME = 'LEVEL1' THEN L3.OSPNAME 
    WHEN L2.OSPNAME = 'LEVEL1' THEN L2.OSPNAME 
    WHEN L1.OSPNAME = 'LEVEL1' THEN L1.OSPNAME 
    ELSE NULL 
end as L1OSPNAME, 

case 
    WHEN L3.OSPNAME = 'LEVEL1' THEN L3.RELATEDOSPID 
    WHEN L2.OSPNAME = 'LEVEL1' THEN L2.RELATEDOSPID 
    WHEN L1.OSPNAME = 'LEVEL1' THEN L1.RELATEDOSPID 
    ELSE NULL 
end as ROOTNODE 


from osptable as L4 

left outer join osptable as L3 
on L4.RELATEDOSPID = L3.OSPID 
left outer join osptable as L2 
on L3.RELATEDOSPID = L2.OSPID 
left outer join osptable as L1 
on L2.RELATEDOSPID = L1.OSPID 
where L4.OSPNAME = 'LEVEL4' 

這給了我這樣的結果,我認爲這是一個希望的

100004 LEVEL4 100003 LEVEL3 100002 LEVEL2 100001 LEVEL1 0 
100009 LEVEL4 100008 NULL NULL LEVEL2 100007 NULL NULL