• 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,我们不返回任何值。

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

    1. with recursive t as (
    2. select
    3. 1 n,1 m
    4. union all
    5. select
    6. if( m=(select max(subtasks_count) from Tasks where task_id = n),n+1,n),
    7. 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)
    8. from t
    9. where
    10. m <=(select max(subtasks_count) from Tasks where task_id = n) and n<=(select max(task_id) from Tasks)
    11. ),
    12. t1 as (select n ,m from t where n <= (select max(task_id) from Tasks))
    13. select n task_id,m subtask_id from t1 where (n,m) not in (select task_id,subtask_id from Executed)
    1. WITH RECURSIVE TT(task_id, subtask_id) AS (
    2. SELECT task_id, subtasks_count FROM Tasks
    3. UNION
    4. SELECT task_id, (subtask_id-1) AS subtasks_count
    5. FROM TT
    6. WHERE subtask_id >= 2
    7. )
    8. SELECT * FROM TT
    9. WHERE (task_id, subtask_id) NOT IN ( SELECT * FROM Executed )
    1. WITH RECURSIVE TT AS (
    2. SELECT task_id, subtasks_count subtask_id FROM Tasks
    3. UNION
    4. SELECT task_id, (subtask_id-1) AS subtasks_count
    5. FROM TT
    6. WHERE subtask_id >= 2
    7. )
    8. SELECT task_id, subtask_id FROM TT where (task_id, subtask_id) not in (select task_id, subtask_id from Executed )

    笔记:

    递归是逐行递归

  • 相关阅读:
    基于PHP的幸福街道的宠物管理平台的设计与开发
    大咖说*计算讲谈社|如何提出关键问题?
    组合导航:中海达iNAV2产品描述及接口描述
    vue——前端发展、vue介绍、mvvm模式、组件化开发、单页面开发、模板插值语法、文本指令、事件指令、属性指令
    经典模型——ResNet
    [SCUCTF2022]校赛Web出题笔记
    牛视源码定制,抖音矩阵系统。来吧 和谐我。
    NOIP普及组2006-2018初赛 2019 CSP-J1 2020 CSP-J1 完善程序题
    蓝桥杯1040
    java 编程 7个简单的调优技巧
  • 原文地址:https://blog.csdn.net/m0_69157845/article/details/125568823