本文介紹了基于條件的遞歸SQL查詢返回TRUE/FALSE的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有以下流程圖。希望這是不言而喻的
在層次結構的頂部有一個請求,它是它下面所有請求的基本父請求。下面的請求具有‘id’、‘parent_id’、‘State’字段
我的最終目標是查明父項的子請求中是否至少有一個具有非法/不合法狀態。有幾個”不合法”的狀態–這就是我使用NOT IN
的原因。因此,如果至少有一個子請求的狀態錯誤,我只需返回TRUE/FALSE
我使用下面的查詢來構建層次結構
DECLARE @main_parent_id bigint = 1
; with cte
as (select id
from tbl_request as rH
WHERE id = @main_parent_id
UNION ALL
select rH.id
from tbl_request as rH
join cte
on rH.parent_id = cte.id
WHERE rH.state NOT IN('not-legit'))
select *
from cte
order by id;
但我不知道如何返回TRUE/FALSE而不僅僅是返回id。此外,@main_parent_id
是一個來自另一個SELECT的動態變量,它返回位于層次結構頂部的所有請求。
從某種意義上說,如果所有子請求都處于LEGIT
狀態,則上述查詢應返回true
,如果至少有一個子請求處于NOT-LEGIT
狀態,則返回false
。
為方便起見,這里有一個SQL Fiddle
推薦答案
已找到非合法分支時停止搜索分支。
with cte
as (select id, state
from tbl_request as rH
WHERE id = @main_parent_id
UNION ALL
select rH.id, rH.state
from tbl_request as rH
join cte
on rH.parent_id = cte.id
and (cte.state is null or cte.state NOT IN('not-legit'))
)
select case when exists(select 1 from cte where cte.state IN('not-legit'))
then 1 else 0 end
這篇關于基于條件的遞歸SQL查詢返回TRUE/FALSE的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,