1767. 寻找没有被执行的任务对(当时对递归不熟)(NO)

SQL架构

表:Tasks

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| task_id        | int     |
| subtasks_count | int     |
+----------------+---------+
task_id 是这个表的主键。
task_id 表示的为主任务的id,每一个task_id被分为了多个子任务(subtasks),subtasks_count表示为子任务的个数(n),它的值表示了子任务的索引从1到n。
本表保证2 <=subtasks_count<= 20。

表: Executed

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| task_id       | int     |
| subtask_id    | int     |
+---------------+---------+
(task_id, subtask_id) 是这个表的主键。
每一行表示标记为task_id的主任务与标记为subtask_id的子任务被成功执行。
本表 保证 ,对于每一个task_id,subtask_id <= subtasks_count。

请试写一个SQL查询语句报告没有被执行的(主任务,子任务)对,即没有被执行的(task_id, subtask_id)。

以 任何顺序 返回即可。

查询结果格式如下。

示例 1:

输入:
Tasks 表:
+---------+----------------+
| task_id | subtasks_count |
+---------+----------------+
| 1       | 3              |
| 2       | 2              |
| 3       | 4              |
+---------+----------------+
Executed 表:
+---------+------------+
| task_id | subtask_id |
+---------+------------+
| 1       | 2          |
| 3       | 1          |
| 3       | 2          |
| 3       | 3          |
| 3       | 4          |
+---------+------------+
输出:
+---------+------------+
| task_id | subtask_id |
+---------+------------+
| 1       | 1          |
| 1       | 3          |
| 2       | 1          |
| 2       | 2          |
+---------+------------+
解释:
Task 1 被分成了 3 subtasks (1, 2, 3)。只有 subtask 2 被成功执行, 所以我们返回 (1, 1) 和 (1, 3) 这两个主任务子任务对。
Task 2 被分成了 2 subtasks (1, 2)。没有一个subtask被成功执行, 因此我们返回(2, 1)和(2, 2)。
Task 3 被分成了 4 subtasks (1, 2, 3, 4)。所有的subtask都被成功执行,因此对于Task 3,我们不返回任何值。

递归深度太深 不让用(错误答案):

with recursive t as (
    select
    1 n,1 m  

    union all

    select
    if( m=(select  max(subtasks_count)  from Tasks where task_id = n),n+1,n),
    if( m=(select  max(subtasks_count)  from Tasks where task_id = n),m-(select  max(subtasks_count)-1 from Tasks where task_id = n),m+1)
    from t
    where 
    m <=(select  max(subtasks_count)  from Tasks where task_id = n) and n<=(select  max(task_id)  from Tasks)
),
t1 as (select n ,m from t where n <= (select  max(task_id)  from Tasks))
select n task_id,m subtask_id from t1 where (n,m) not in (select task_id,subtask_id from Executed)
WITH RECURSIVE TT(task_id, subtask_id) AS (
    SELECT task_id, subtasks_count FROM Tasks
        UNION
    SELECT task_id, (subtask_id-1) AS subtasks_count 
    FROM TT 
    WHERE subtask_id >= 2
)

SELECT * FROM TT
WHERE (task_id, subtask_id) NOT IN ( SELECT * FROM Executed )
WITH RECURSIVE TT AS (
    SELECT task_id, subtasks_count subtask_id FROM Tasks
        UNION
    SELECT task_id, (subtask_id-1) AS subtasks_count 
    FROM TT 
    WHERE subtask_id >= 2
)

SELECT task_id, subtask_id FROM TT where (task_id, subtask_id) not in (select task_id, subtask_id from Executed )

笔记:

递归是逐行递归

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值