Create table If Not Exists Tasks (task_id int, subtasks_count int)
Create table If Not Exists Executed (task_id int, subtask_id int)
Truncate table Tasks
insert into Tasks (task_id, subtasks_count) values ('1', '3')
insert into Tasks (task_id, subtasks_count) values ('2', '2')
insert into Tasks (task_id, subtasks_count) values ('3', '4')
Truncate table Executed
insert into Executed (task_id, subtask_id) values ('1', '2')
insert into Executed (task_id, subtask_id) values ('3', '1')
insert into Executed (task_id, subtask_id) values ('3', '2')
insert into Executed (task_id, subtask_id) values ('3', '3')
insert into Executed (task_id, subtask_id) values ('3', '4')
分析:
①准备知识 首先先学习一个循环recursive
构造一个 1 - 10 的列表
(先将1作为number列的值 连接 每一个 number+1 直到number值为10)
复制代码
with recursive number_series as (
select 1 as number
union all select number+1 as number
from number_series
where number < 10
)
select * from number_series;
with recursive subtasks as(
select task_id,subtasks_count as sub_id from Tasks
union all
select task_id,sub_id-1
from subtasks
where sub_id > 1
)
select subtasks.task_id,sub_id from subtasks
③将此表与Executed表进行左连接 过滤出executed表中为空的那行任务对
复制代码
with recursive subtasks as(
select task_id,subtasks_count as sub_id from Tasks
union all
select task_id,sub_id-1
from subtasks
where sub_id > 1
)
select subtasks.task_id,sub_id subtask_id from subtasks left join Executed
on Executed.task_id = subtasks.task_id and Executed.subtask_id = subtasks.sub_id
where Executed.subtask_id is null;
代码:
sql复制代码
with recursive subtasks as(
select task_id,subtasks_count as sub_id from Tasks
union all
select task_id,sub_id-1
from subtasks
where sub_id > 1
)
select subtasks.task_id,sub_id subtask_id from subtasks left join Executed
on Executed.task_id = subtasks.task_id and Executed.subtask_id = subtasks.sub_id
where Executed.subtask_id is null;