在SQL Server中迭代没有循环的记录

时间:2018-10-03 03:22:12

标签: sql-server tsql

我实际上是SQL Server的新手,需要您的帮助来解决我的查询问题。

我有一个像这样的表:

CurentID    NodeName      PredecessorID
---------------------------------------
AB          predecessor   Start
CD          predecessor   AB
EF          predecessor   CD
OP          predecessor   EF
GH          predecessor   CD
KL          predecessor   GH
IJ          predecessor   GH
LM          predecessor   IJ
MN          predecessor   LM
QN          predecessor   OP
QN          predecessor   KL

我需要找到给定CurentID的所有先前ID。

例如:CurrentID LM 的predecessorID需要返回:

CurrentID  Result
-----------------
 IJ         1
 GH         1
 CD         1
 AB         1
 Start      1

和currentID QN 的前代ID将返回:

CurrentID    Result
--------------------
KL           1
GH           1
CD           1
AB           1
Start        1
OP           2
EF           2
CD           2
AB           2
Start        2

我可以使用While Exists (...)来完成该查询,但是对于丢失的数据需要花费很长时间执行

有人在不使用循环的情况下获得此结果的任何技巧吗?

1 个答案:

答案 0 :(得分:0)

;WITH temp(CurrentID,NodeName,PredecessorID)  
AS  
(  
SELECT  'AB','Predecessor','start' UNION ALL  
SELECT 'CD','Predecessor','AB' UNION ALL  
SELECT 'EF','Predecessor','CD' UNION ALL  
SELECT 'OP','Predecessor','EF' UNION ALL  
SELECT 'GH','Predecessor','CD' UNION ALL  
SELECT 'KL','Predecessor','GH' UNION ALL   
SELECT 'IJ','Predecessor','GH' UNION ALL
SELECT 'LM','Predecessor','IJ' UNION ALL
SELECT 'MN','Predecessor','LM' UNION ALL
SELECT 'QN','Predecessor','OP' UNION ALL
SELECT 'QN','Predecessor','KL'  
)  
, CTE_Recrusive  
AS  
(  
SELECT ROW_NUMBER() OVER (ORDER By CurrentID) ROWS, CurrentID,NodeName,PredecessorID  
FROm TEMP  
WHERE CurrentID='QN'  --and row=1
UNION ALL  
SELECT c.rows, t.CurrentID,t.NodeName,t.PredecessorID  
FROm CTE_Recrusive c  
INNER JOIN TEMP t on c.PredecessorID = t.CurrentID  
)  
select PredecessorID as CurrentID,rows as Result from  CTE_Recrusive 
order by rows