SQLite中的递归CTE

时间:2015-10-20 03:16:29

标签: sql sqlite aggregate-functions common-table-expression recursive-query

我正在尝试学习如何使用SQL 1999中引入的公用表表达式来解决通用物料清单问题。我假设给出以下表格:

create table part(id int, name string, price int)
create table assembly(part_id int, subpart_id int, quantity int)

汇编表中的一行表示一个部件包含子部件的多个实例,而子部件可能又有自己的子部件,依此类推。汇编表表示一个结构,一个树,给定的part_id作为其根。

我想计算结构中每个部分的总出现次数。

这是我尝试使用公用表表达式:

WITH RECURSIVE bom(part_id, component_id, total) AS
    (SELECT id, id, 1 FROM part 
        UNION
     SELECT assembly.part_id, bom.component_id, sum(assembly.quantity * bom.total)
     FROM assembly, bom
     WHERE assembly.subpart_id = bom.part_id
     GROUP BY assembly.part_id, bom.component_id)
SELECT component_id, total FROM bom WHERE part_id = root;

在Mac OS X 10.9.5上的SQLite 3.9.1下,我收到以下错误消息: 错误:第78行附近:不支持递归聚合查询

那么,这是一个SQLite限制,还是SQL标准限制?

在任何一种情况下,任何人都可以建议我如何重写此解决方案以在公用表表达式中累积更多信息,然后在使用结果表的查询中执行聚合?

非常感谢, 罗德尼

1 个答案:

答案 0 :(得分:0)

这是通过将聚合移动到外部查询来解决问题的简单方法:

WITH RECURSIVE bom(part_id, component_id, total) AS
    (SELECT id, id, 1 FROM part 
        UNION ALL
     SELECT assembly.part_id, bom.component_id, assembly.quantity * bom.total
     FROM assembly, bom
     WHERE assembly.subpart_id = bom.part_id)
SELECT component_id, SUM(total) FROM bom 
WHERE part_id = root
GROUP BY component_id;

此解决方案比初始尝试需要更多空间和更多时间。