【发布时间】:2017-10-08 07:10:04
【问题描述】:
我有如下数据库表任务。
SELECT _id,name,parentId FROM Task;
_id name parentId
---------- -------------------- ----------
4 Software Development
5 Machine Learning
6 Programing 4
7 Build System 4
8 version control 4
9 Android App Developm 4
10 Udacity Cource 5
11 Mathematics 5
12 skLearn docs 5
13 problem solving 6
14 breakdown 13
15 language 6
16 c 15
17 c++ 15
18 java 15
19 kotlin 15
20 gradle 7
21 bazel 7
22 git 8
23 svn 8
所有任务及其子任务都在一个表中,使用_id(主键)和parentId与各自的父任务相关。
例如任务名称 'java' 有 _id = 18 和 parentId = 15 意味着 'java' 是 _id = 15 的子任务,即 'language'。
同样,“语言”的 _id = 15 和 parentId = 6 意味着“语言”是 _id = 6 的子任务,即“编程”。
同样的“编程”是“软件开发”的子任务。
而“软件开发”是 null 的子任务。
所以我需要一个查询,它为输入_id = 18(即'java')提供如下输出,它是父任务列表,父任务的父...任务。
_id 名称 parentId 4 软件开发 null 6 编程 4 15 语言 6 18 爪哇 15目前我可以在一个循环中使用 4 个查询来获取此输出。
SELECT _id,name,parentId FROM task WHERE _id = 18
在下一次迭代中,_id 将是上述查询输出中 parentId 的值
这很耗时,所以我们可以为此提供更好的解决方案。
【问题讨论】:
-
答案是 CTE(公用表表达式)。查看 WITH 语句。 sqlite.org/lang_with.html这是在SQL中查询树结构的常用方法(基本上就是你所拥有的)
标签: android sqlite android-sqlite recursive-cte