Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

basic recursive query on sqlite3?

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

like image 318
Eric Avatar asked Sep 17 '11 18:09

Eric


People also ask

Does SQLite support recursive queries?

Tree in SQLiteA recursive query in SQLite can be executed using CTE.

What are recursive in SQLite?

Recursive Common Table Expressions. A recursive common table expression can be used to write a query that walks a tree or graph. A recursive common table expression has the same basic syntax as an ordinary common table expression, but with the following additional attributes: The "select-stmt" must be a compound select ...

How do you create a recursive query?

First, specify the name of the view that you want to create in the CREATE RECURSIVE VIEW clause. You can add an optional schema-qualified to the name of the view. Second, add the SELECT statement to query data from base tables. The SELECT statement references the view_name to make the view recursive.

What is a recursive query explain with example?

A recursive query is one that is defined by a Union All with an initialization fullselect that seeds the recursion. The iterative fullselect contains a direct reference to itself in the FROM clause.


2 Answers

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:

enter image description here

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:

  • Grab the initial row and the sub-part IDs.
  • Grab the rows and sub-part IDs for the sub-parts.
  • Repeat until nothing comes back.
like image 55
mu is too short Avatar answered Oct 07 '22 23:10

mu is too short


In this SQLite Release 3.8.3 On 2014-02-03 has been added support for CTEs. Here is documentation WITH clause Example:

WITH RECURSIVE cnt(x) AS (  SELECT 1  UNION ALL  SELECT x+1 FROM cnt   LIMIT 1000000 ) SELECT x FROM cnt; 
like image 20
Roman Nazarevych Avatar answered Oct 07 '22 23:10

Roman Nazarevych