本文介紹了基于條件的遞歸SQL查詢返回TRUE/FALSE的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我有以下流程圖。希望這是不言而喻的
在層次結(jié)構(gòu)的頂部有一個(gè)請(qǐng)求,它是它下面所有請(qǐng)求的基本父請(qǐng)求。下面的請(qǐng)求具有‘id’、‘parent_id’、‘State’字段
我的最終目標(biāo)是查明父項(xiàng)的子請(qǐng)求中是否至少有一個(gè)具有非法/不合法狀態(tài)。有幾個(gè)”不合法”的狀態(tài)–這就是我使用NOT IN
的原因。因此,如果至少有一個(gè)子請(qǐng)求的狀態(tài)錯(cuò)誤,我只需返回TRUE/FALSE
我使用下面的查詢來(lái)構(gòu)建層次結(jié)構(gòu)
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
是一個(gè)來(lái)自另一個(gè)SELECT的動(dòng)態(tài)變量,它返回位于層次結(jié)構(gòu)頂部的所有請(qǐng)求。
從某種意義上說(shuō),如果所有子請(qǐng)求都處于LEGIT
狀態(tài),則上述查詢應(yīng)返回true
,如果至少有一個(gè)子請(qǐng)求處于NOT-LEGIT
狀態(tài),則返回false
。
為方便起見(jiàn),這里有一個(gè)SQL Fiddle
推薦答案
已找到非合法分支時(shí)停止搜索分支。
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
這篇關(guān)于基于條件的遞歸SQL查詢返回TRUE/FALSE的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,