我实际上是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 (...)
来完成该查询,但是对于丢失的数据需要花费很长时间执行
有人在不使用循环的情况下获得此结果的任何技巧吗?
答案 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