在SQLite中没有顶级结果的递归CTE查询

时间:2015-01-29 14:41:30

标签: android sqlite recursion common-table-expression

我目前正在研究Android SQLite数据库的递归查询。我有一个包含资产的表,可以通过引用父母来形成层次结构。例如:

AssetId | ParentAssetId      1--2--5
-----------------------      |  |
      1 | NULL               |  |--6--8
      2 | 1                  |  |  |
      3 | 1                  |  |  |--9
      4 | 1                  |  |
      5 | 2                  |  |--7
      6 | 2                  |
      7 | 2                  |--3
      8 | 6                  |
      9 | 6                  |--4--10
     10 | 4            

我需要找到给定起点的所有后代,但不包括起点。例如:

1 = 2,3,4,5,6,7,8,9,10
2 = 5,6,7,8,9
6 = 8,9

我设法使用SQLite页面中的示例来实现这一点:

SQLite WITH page

WITH RECURSIVE
Child(AssetId) AS (
VALUES (1)
UNION
SELECT Assets.AssetId FROM Assets, Child
WHERE Assets.ParentAssetID = Child.AssetId)
SELECT AssetId FROM Child WHERE AssetId != 1

这样可行,但我对于筛选原始项目的最终WHERE子句不满意。是否有其他方法可以在不包含原始项目的情况下启动级联?

1 个答案:

答案 0 :(得分:1)

您可以从原始项目的子项开始:

WITH RECURSIVE
Child(AssetId) AS (
  SELECT AssetId FROM Assets WHERE ParentAssetID = 1
  UNION ALL
  SELECT ...
)
SELECT AssetId FROM Child

这实际上并不简单。