sqlite3上的基本递归查询?
我有一个简单的 sqlite3 表,如下所示:
Table: Part
Part SuperPart
wk0Z wk00
wk06 wk02
wk07 wk02
eZ01 eZ00
eZ02 eZ00
eZ03 eZ01
eZ04 eZ01
我需要运行递归查询来查找给定 SuperPart 及其所有子零件的所有对。 假设我有 eZ00。 eZ00 是 eZ01 的超级部分,eZ01 是 eZ03 的超级部分。结果不仅必须包含 (eZ00, eZ01) 和 (eZ01 和 eZ03) 对,而且还必须包含 (eZ00, eZ03) 对。
我知道还有其他定义表的方法,但我在这里别无选择。 我知道如果我知道树的深度,我可以使用多个联合,但我并不总是知道我想要的深度。 拥有类似“WITH RECURSIVE”甚至只是“WITH (,,) AS x”之类的东西会有所帮助,但对于我搜索过的内容,这在 sqlite 中是不可能的,对吧?
有没有办法在sqlite3中进行这种递归查询?
更新:
提出这个问题时,SQLite不支持递归查询,但是正如 @lunicon 所说,SQLite 从 3.8.3 开始支持递归 CTE sqlite.org/lang_with.html
I have a simple sqlite3 table that looks like this:
Table: Part
Part SuperPart
wk0Z wk00
wk06 wk02
wk07 wk02
eZ01 eZ00
eZ02 eZ00
eZ03 eZ01
eZ04 eZ01
I need to run a recursive query to find all the pairs of a given SuperPart with all of its subParts.
So let's say that I have eZ00. eZ00 is a superpart of eZ01 and eZ01 is a superpart of eZ03. The result must include not only the pairs (eZ00, eZ01) and (eZ01 and eZ03) but must also include the pair (eZ00, eZ03).
I know there are other ways of defining the table, but I have no choice here.
I know i can use several unions if I know the depth of my tree, but I won't allways know how depth I want to go.
It'd help to have something like WITH RECURSIVE or even just WITH (,,) AS x but for what I've searched, that's not possible in sqlite, right?
Is there a way to do this recursive query in sqlite3?
UPDATE:
When this question was made, SQLite didn't support recursive queries, but as stated by @lunicon, SQLite now supports recursive CTE since 3.8.3 sqlite.org/lang_with.html
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
如果您足够幸运使用 SQLite 3.8.3 或更高版本,那么您确实可以使用 WITH:
感谢 lunicon 让我们了解此 SQLite 更新。
在 3.8.3 之前的版本中,SQLite 不支持递归 CTE(或根本不支持 CTE),因此没有 在 SQLite 中使用。由于您不知道它有多深,因此您无法使用标准 JOIN 技巧来伪造递归 CTE。您必须以困难的方式做到这一点,并在客户端代码中实现递归:
If you're lucky enough to be using SQLite 3.8.3 or higher then you do have access to recursive and non-recursive CTEs using WITH:
Thanks to lunicon for letting us know about this SQLite update.
In versions prior to 3.8.3, SQLite didn't support recursive CTEs (or CTEs at all for that matter) so there was no WITH in SQLite. Since you don't know how deep it goes, you can't use the standard JOIN trick to fake the recursive CTE. You have to do it the hard way and implement the recursion in your client code:
在此 2014-02-03 发布的 SQLite 3.8.3 中添加了对 CTE 的支持。这是文档 WITH 子句
例子:
In this SQLite Release 3.8.3 On 2014-02-03 has been added support for CTEs. Here is documentation WITH clause
Example:
根据 带有文档的 sqlite 中找到的示例,查询
将输出
为“应该是”预期的
初始值递归表的记录可以替换为,
以便也获得初始超级部分的父级,尽管在这种情况下根本没有父级。
Based on the samples found in sqlite with documentation, the query
would output
as "it should be" expected
the initial record of the recursive table can be replaced with
in order to get also the parent of the initial superpart, although in this case there is no parent at all.
这是我能想到的最基本的查询,它生成一个系列,我们从 1,2 开始,不断添加 1 直到达到 20。没什么用,但稍微玩一下这个将帮助您构建更复杂的递归查询
最基本的数列
Prints
这是另一个生成斐波那契数列的简单示例
我们从 a = 0, b = 1 开始,然后 a = b, b = a + b 就像在任何编程语言中所做的那样
斐波那契数列
This is the most basic query that I could think of, it generates a series where we start with 1,2 and keep adding 1 till we hit 20. not much useful but playing around a bit with this will help you build more complex recursive ones
The most basic series
Prints
Here is another simple example that generates Fibonacci numbers
we start with a = 0, b = 1 and then go a = b, b = a + b just like you would do in any programming language
Fibonacci Series
Prints
有一个黑客
http://dje.me/2011/03/26/sqlite-data -trees.html
there's a hack
http://dje.me/2011/03/26/sqlite-data-trees.html