首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据递归查询的结果(使用语句)创建一个表

根据递归查询的结果(使用语句)创建一个表
EN

Stack Overflow用户
提问于 2019-11-10 18:12:23
回答 1查看 883关注 0票数 3

我希望根据SQLite中递归查询的结果创建一个新的(持久性)表。例如,让我们使用列(n, fct)创建一个表,其中n表示一个自然数,fct表示它的阶乘:

代码语言:javascript
复制
-- factorial of n = 0, 1, ..., 5
WITH RECURSIVE fact_i (n, fct) AS (
     VALUES (0, 1)
     UNION ALL
     SELECT n+1, fct * (n+1) FROM fact_i
     WHERE n < 5)
SELECT * FROM fact_i;

这会导致

代码语言:javascript
复制
0|1
1|1
2|2
3|6
4|24
5|120

但是,我想将结果存储在一个持久表中,比如factorials

我试过了

代码语言:javascript
复制
CREATE TABLE factorials (n, fct) AS
WITH RECURSIVE fact_i (n, fct) AS (
     VALUES (0, 1)
     UNION ALL
     SELECT n+1, fct * (n+1) FROM fact_i
     WHERE n < 5)
SELECT * FROM fact_i;

代码语言:javascript
复制
WITH RECURSIVE fact_i (n, fct) AS (
     VALUES (0, 1)
     UNION ALL
     SELECT n+1, fct * (n+1) FROM fact_i
     WHERE n < 5)
CREATE TABLE factorials (n, fct) AS
SELECT * FROM fact_i;

然而,两者都会导致语法错误。有办法在SQLite中创建这样的表吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-10 18:14:37

是的,这是可能的(用附加的SELECT * FROM ()包装):

代码语言:javascript
复制
CREATE TABLE factorials AS
SELECT *
FROM (
WITH RECURSIVE fact_i (n, fct) AS (
     VALUES (0, 1)
     UNION ALL
     SELECT n+1, fct * (n+1) FROM fact_i
     WHERE n < 5)
SELECT * FROM fact_i) s;

编辑:

实际上,您需要做的就是从CREATE TABLE中删除列列表。

代码语言:javascript
复制
CREATE TABLE factorials AS
WITH RECURSIVE fact_i (n, fct) AS (
     VALUES (0, 1)
     UNION ALL
     SELECT n+1, fct * (n+1) FROM fact_i
     WHERE n < 5)
SELECT * FROM fact_i;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58791562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档