2016-10-14 245 views
0

嗨,我有以下節點和鏈接表。我需要使用Node表構建線座標數組。但是,如果節點類型是頂點,我需要將座標添加到數組中,並獲取下一個座標(使用FromID-> ToID),直到找到非頂點,這是該行的結束點。 我試圖使用以前的帖子的遞歸查詢解決方案,但是這不起作用。遞歸查詢或查詢XML(通過加入2個表)輸出實現此目的的最佳方式?我使用SQL Server 2008的SQL Server遞歸查詢

節點表:

 
NODEID TYPE COORDS
BEND1 VALVE (439754,350240) BEND3 VALVE (439720,350268) COP1 HYDRANT (439879,350292) EFJ1 FITTING (439740,350248) NFH1 VALVE (439798,350262) NFH2 VALVE (439802,350313) NWO3 VALVE (439752,350244) NSV1 VALVE (439877,350292) NSV2 VALVE (439753,350245) NSV3 VALVE (439752,350244) TP1 HYDRANT (439752,350244) TP2 HYDRANT (439864,350360) VERTEX3 VERTEX (439805,350314) VERTEX1 VERTEX (439730,350286) VERTEX2 VERTEX (439769,350301) PR4 VALVE (439824,350332) VERTEX6 VERTEX (439853,350357)

鏈接表

 
FROMID TOID STATUS  
BEND1 NWO3 OPER  
BEND3 VERTEX1 OPER  
COP1 NSV1 OPER  
EFJ1 BEND3 OPER  
NFH1 NSV1 OPER  
NFH2 VERTEX3 OPER  
TP1  NSV3 OPER  
VERTEX1 VERTEX2 OPER  
VERTEX2 NFH2 OPER  
VERTEX3 PR4 OPER 

預期輸出

 
RECNUM  FROMID TOID  LINE_COORDS 
1   BEND1  NWO3  (439754,350240),(439752,350244) 
2   BEND3  NFH2  (439720,350268),(439730,350286),(439769,350301),(439802,350313) 
3   COP1  NSV1  (439879,350292),(439877,350292) 
4   EFJ1  BEND3  (439740,350248),(439720,350268) 
5   NFH1  NSV1  (439798,350262),(439877,350292) 
6   NFH2  PR4  (439802,350313),(439805,350314),(439824,350332) 
7   TP1  NSV3  (439752,350244),(439752,350244) 

回答

0

你可以試試這個,但我沒有SQL Server上的手測試查詢。

WITH PathCTE as 
(
    select 
     X1.FromID as FromID, 
     X1.ToID as ToID, 
     [Path] = cast(N1.Coords + ',' + N2.Coords as nvarchar(max)), 
     Stop = (case when N2.TYPE = 'VERTEX' THEN 0 ELSE 1 END) 
    from 
     tblLink X1 inner join tblNode N1 on X1.FromID = N1.NodeID 
        inner join tblNode N2 on X1.ToID = N2.NodeID 
    where 
     not exists (select 1 from tblLink X2 where X2.ToID = X1.FromID AND N1.TYPE = 'VERTEX') 

    union all 

    select 
     PathCTE.FromID, 
     X.ToID, 
     [Path] = PathCTE.[Path] + ',' + tblNode.Coords, 
     STOP = (case when tblNode.TYPE = 'VERTEX' THEN 0 ELSE 1 END) 
    from 
     PathCTE 
     inner join tblLink X on PathCTE.ToID = X.FromID 
     inner join tblNode on X.ToID = tblNode.NodeID 
    where PathCTE.Stop = 0 
) 

select RecNUM = row_number() over (order by FromID), FromID, ToID, Path as Line_Coords 
from 
    PathCTE 
where 
    PathCTE.Stop = 1 
order by 
    FromID; 
+0

謝謝。但這是我得到的輸出:

 RecNUM \t FromID \t Path 1 \t BEND1 \t (439754,350240),(439752,350244 2 \t COP1 \t (439879,350292),(439877,350292 3 \t COP1 \t (439879,350292),(439877,350292 4 \t EFJ1 \t (439740,350248),(439720,350268 5 \t NFH1 \t (439798,350262),(439877,350292 6 \t NFH1 \t (439798,350262),(439877,350292 7 \t TP1 \t (439752,350244),(439752,350244 
user3050151

+0

不幸的是,查詢不起作用。我沒有得到頂點的座標 – user3050151

+0

你是對的,我糾正並測試了這個新的查詢。 – Polux2