SQLite:在WITH子句中的普通表后,是否可以使用递归表表达式?

时间:2017-09-06 14:00:53

标签: sqlite

我试图在同一个WITH语句中同时拥有一个普通的表表达式和一个递归的表达式。作为递归的一个,取决于我想要普通表表达式的普通表达式。当我试图这样做时,它只是不起作用。首先使用递归表表达式。

SQLFiddle中的以下案例说明了问题:http://sqlfiddle.com/#!5/b5362/3063/0

以下代码可以正常使用:

WITH RECURSIVE dates(x) AS ( 
            SELECT datetime('2015-01-01')
                UNION ALL 
        SELECT datetime(x, '+1 MONTHS') FROM dates WHERE x<'2016-01-01' 
    )
,
testi AS (select * from supportContacts
order by id desc)
    SELECT *
    FROM dates;

但是当我从递归表语句开始时它不起作用,即下面的代码不起作用。

WITH testi AS (select * from supportContacts
    order by id desc)
,
RECURSIVE dates(x) AS ( 
            SELECT datetime('2015-01-01')
                UNION ALL 
            SELECT datetime(x, '+1 MONTHS') FROM dates WHERE x<'2016-01-01' 
    )
SELECT *
FROM dates;

如果有人能告诉我是否可以先使用递归表语句,那么我会很高兴。在这种情况下,我会怎样做。

最诚挚的问候//亨利

1 个答案:

答案 0 :(得分:0)

如果您使用的是RECURSIVE,则必须在WITH之后直接使用{<1}}。

根据SQL标准,这意味着以下CTE 中的任何可能是递归的(但如果实际存在任何一个,则需要它)。< / p>

(因此数据库必须自己找出是否有任何特定的CTE是递归的。因此,SQLite(以及许多其他DB)使这个词完全是可选的。)