sql - 在基于条件的递归 SQL 查询中返回真/假
问题描述
我有以下流程图。希望这是不言自明的
在层次结构的顶部有一个请求,它是其下所有请求的基本父级。以下请求具有“id”、“parent_id”、“state”字段
我的最终目标是找出父母的至少一个子请求是否具有非法/不合法状态。有一些“不合法”的状态——这就是我使用NOT IN
. 所以,如果至少一个子请求的状态错误,我需要简单地返回真/假
我使用下面的查询来构建层次结构
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;
但我不知道如何返回真/假,而不仅仅是返回 id。此外,还有@main_parent_id
一个来自另一个 SELECT 的动态变量,它返回层次结构顶部的所有请求。
从某种意义上说,true
如果所有子请求都处于LEGIT
状态,false
如果至少有一个子请求处于NOT-LEGIT
状态,则上面的查询应该返回。
为了您的方便,这里有一个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
推荐阅读
- python - Python多处理:如果孩子关闭,如何关闭父母?
- javascript - 返回最短的单词
- android - 位图未在 canvas-android 上绘制
- html - 如何在父元素剪辑路径清除的区域顶部显示子 HTML 元素?
- swift - 在 ObservableObject 中调用多个函数
- python - Python pandas timedelta64 fillna
- amazon-web-services - AWS SNS OTP 电子邮件
- flutter - 颤振 - 查看 .pub-cache 文件给出请求 textDocument/documentSymbol 失败
- github - 不要触发将新分支推送到远程的操作
- reactjs - 无法从 GetMapping 获取数据 - 类组件