【发布时间】:2021-11-01 02:23:01
【问题描述】:
我有以下流程图。希望它是不言自明的
在层次结构的顶部有一个请求,它是其下所有请求的基本父级。以下请求具有 '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,它返回层次结构顶部的所有请求。
从某种意义上说,如果所有子请求都处于LEGIT 状态,则上面的查询应该返回true,如果至少有一个子请求处于NOT-LEGIT 状态,则返回false。
为了您的方便,这里是SQL Fiddle
【问题讨论】:
-
这听起来像是对
IF EXISTS/IF NOT EXISTS的查询 - 所以如果一条记录存在于非法状态,则选择 0,否则选择 1 -
您的第一个也是最大的问题是您过滤不合法。您如何与您告诉编译器遗漏的东西进行比较?其次,您可以在 cte 输出的最终选择中轻松处理此问题
-
感谢您发布代码和 sql 小提琴!不过,您现有的代码似乎与您的意图不太相符。现在,您正在构建一个仅包含“合法”请求的层次结构。但这并不能帮助您确定“父级的至少一个子请求是否不合法”。因此,与其说是关于返回 ID 的问题,不如说是关于如何“解析”整个层次结构的问题。对吗?
标签: sql sql-server common-table-expression hierarchy recursive-query