簡體   English   中英

帶有參數的存儲過程中每一行的遞歸 CTE

[英]Recursive CTE on every row in a stored procedure with parameter

我有一個名為 AccountNode 的表。 其中列 nodeId 在 ParentNodeId col 中有一個父級。

AccountNode
nodeId   | ParentNodeId  |  Flag | SetId | 

1           2              N     1 
2           115            N     1 
115         4              N     1
4           5              Y     1
12          13             N     1 
13          14             N     1 
14          15             Y     1 
23          24             N     1 
25          30             Y     1 

我需要什么對於作為參數傳遞給過程的 setId ,我需要獲取標志為 Y 的每個節點 id 的父節點(這是我們需要停止遞歸 cte 的地方)

eg : 
input: 
for set_id : 1 
output: 

nodeId    parentNode  flag    set_id
1           5           Y        1 
12          15          Y        1 
25          30          Y        1 

我已經編寫了一個遞歸 cte 來獲取節點 id 的父節點,但是我在為 setid 編寫它時遇到了麻煩,我需要遍歷 setid 中的所有 nodeId 來獲取 parentNode 這是我的 sql:

with accountNode_cte  (nodeId, parentNode, flag, set_id) as 
(select nodeId , parentNode, flag, set_id) from accountNode where nodeId = '1' 
union all
select accountNode.nodeId, accountNode.parentNode, accountNode.flag, accountNode.set_id from 
accountNode 
join accountNode_cte on accountNode.nodeId = accountNode_cte.parentNode
and accountNode_cte.flag !='Y')
select * from accountNode_cte where flag='Y'

我對編寫 sql 程序還很陌生,不知道該怎么做

從起始節點遍歷節點層次結構,記住起始點,跟蹤級別,在起始點級別行中取最大值。

with accountNode_cte(p, l, nodeId, parentNode, flag, set_id) as (
  select parentNodeId p, 1 l, nodeId , parentNodeId, flag, set_id 
  from accountNode 
  where flag = 'Y' and set_id = 1
  
  union all
  
  select p, l+1, accountNode.nodeId, accountNode.parentNodeId, accountNode.flag, accountNode.set_id 
  from accountNode 
  join accountNode_cte on accountNode.parentnodeId = accountNode_cte.NodeId
)
select distinct first_value(nodeId) over(partition by p order by l desc) nodeId, p parentnId
from accountNode_cte;

數據庫<>小提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM