2016-10-14 131 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