Итерация записи без цикла в SQL Server - PullRequest
0 голосов
/ 03 октября 2018

Я буквально новичок в 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.

Например, для параметра beforecessorID для CurrentID LM необходимо вернуть:

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

, а для параметраcessID ID для currentID QN будет возвращено:

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 голосов
/ 03 октября 2018
;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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...