sqlite 如何将count()指定为CTE递归迭代的限制?

v8wbuo2f  于 2022-11-14  发布在  SQLite
关注(0)|答案(1)|浏览(184)

我试图使用join限制公用表表达式的递归迭代次数,但无论如何它都会无限循环。我做错了什么?
我不想要一个固定的迭代限制,而是根据data表的count(*)动态限制:

create table data(
    name varchar,
    year integer,
    salary double
);

insert into data values 
('a',23, 4100),
('b',22, 1000),
('c',17, 2000);

with recursive myvalues as (
    select name, year, salary from data d
    union all
    select d.name, d.year, d.salary from myvalues v
    join data d on d.name = v.name
    --where v.count <= d.count --error
) select * from myvalues order by name;
dffbzjpn

dffbzjpn1#

V.count和D.count都没有在任何地方定义。你怎么能指望它知道你在数什么?
您必须做两件事:1.将数据表中的记录数添加到查询中的每条记录中;2.在查询中创建一个递增变量,该变量每次通过时都会递增一条。
第一个是通过在您定义的CTE之前运行另一个CTE并将其结果连接到第二个CTE来完成的。
就像这样:

With Recursive tablecount AS (
   Select count(*) as maxn from data
), myvalues AS (
   Select name, year, salary, 1 as N, maxn
   From data d Inner Join tablecount c
  Union All
   Select name, year, salary, v.N+1, v.maxn
   From data d inner join myvalues v
     On d.name = v.name
   Where v.N<v.maxn
)
Select name, year, salary
From myvalues

第一个CTE获取查询中的行数。第二个CTE是您的原始查询,添加了字段N(跟踪通过的次数)和Maxn(合并记录计数)。WHERE子句比较两者;CTE在没有检索到行时终止。

相关问题