Создать таблицу по результатам рекурсивного запроса (с оператором) - PullRequest
2 голосов
/ 10 ноября 2019

Я хочу создать новую (постоянную) таблицу из результатов рекурсивного запроса в SQLite. Например, давайте создадим таблицу со столбцами (n, fct), где n обозначает натуральное число и fct его факториал:

-- 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;

, что приводит к

0|1
1|1
2|2
3|6
4|24
5|120

ОднакоЯ хотел бы сохранить результаты в постоянной таблице, скажем factorials.

Я пытался

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;

или

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?

1 Ответ

1 голос
/ 10 ноября 2019

Да, это возможно (упаковка с дополнительными SELECT * FROM ()):

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;

дБ <> fiddle demo

РЕДАКТИРОВАТЬ:

На самом деле все, что вам нужно сделать, это удалить список столбцов из CREATE TABLE:

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;

db <> fiddle demo2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...