[英]Execute stored procedure programmatically inside recursive CTE instead of Cursor
[英]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.