加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用SQLite的新WITH RECURSIVE CTE子句

发布时间:2020-12-12 18:57:16 所属栏目:百科 来源:网络整理
导读:SQLite 3.8.3增加了对CTE的支持.我尝试了一些 sample CTEs on this page并且它们工作正常.但是,在阅读文档并尝试调整一些示例后,我无法创建简单的测试. 首先,我创建一个包含两个字段的简单表:id和parent.这将创建一个简单的树或链接的记录列表: CREATE TAB
SQLite 3.8.3增加了对CTE的支持.我尝试了一些 sample CTEs on this page并且它们工作正常.但是,在阅读文档并尝试调整一些示例后,我无法创建简单的测试.

首先,我创建一个包含两个字段的简单表:id和parent.这将创建一个简单的树或链接的记录列表:

CREATE TABLE test(id INTEGER PRIMARY KEY ASC,parent INTEGER);

现在我用几行填充它:

INSERT INTO test (parent) VALUES (NULL); 
INSERT INTO test (parent) VALUES (1); 
INSERT INTO test (parent) VALUES (2); 
INSERT INTO test (parent) VALUES (3);

之后我有一个看起来像这样的表:

---+-------
id | parent
---+-------
 1 | NULL
 2 |  1
 3 |  2
 4 |  3

现在我想生成沿3和1之间路径的行列表:

WITH RECURSIVE test1(id,parent) AS (
    VALUES(3,2) 
    UNION ALL 
    SELECT * FROM test WHERE test.parent=test1.id) 
SELECT * FROM test1;

但我得到错误:

no such column: test1.id

test和test1都有一个id字段,为什么它声称它不存在?我已多次查看文档,但没有看到我的错误.我究竟做错了什么?

解决方法

有必要在SELECT中包含test1表:

WITH RECURSIVE test1(id,2)
    UNION ALL 
    SELECT test.id,test.parent FROM test,test1 WHERE test1.parent=test.id)
SELECT * FROM test1;

请注意,WHERE子句已被反转,问题中的原始测试从当前行返回到结尾,而不是从结束返回到开始.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读