sql - postgresQL 中子产品的递归列表

标签 sql postgresql recursion recursive-query

我有一个关于 Postgres SQL 的快速问题。

我的目标是创建一个产品表,其中我们有 1 个或多个父产品,然后是某些子产品。

product schema

在另一个表sales中,我只是把它放在某个产品的销售额中。

sales schema

现在我的SQL:

我基本上想检索每个父级产品的所有销售额,在我的示例中,手机和家庭以及子产品的销售额总和。

到目前为止我的 SQL:

WITH RECURSIVE assignDepth (id, depth, parent) AS (
  SELECT p.id, 0 as depth, p.parent
  FROM product p
  WHERE p.parent IS NULL
  UNION ALL
  SELECT p.id, c.depth+1, p.parent
  FROM product p, assignDepth c
  WHERE p.parent = c.id
 ),
  getProductValue (id, name, value, parent) AS (
   SELECT p.id, p.name, 0 as value, p.parent
   FROM product p,
   WHERE p.depth = (SELECT MAX(depth) FROM assignDepth)
   UNION ALL
         SELECT p.id, p.name,SUM(
             SELECT s.value
             FROM sales s
             WHERE c.id = s.product), p.parent
   FROM product p, getProductValue c
   WHERE p.id = c.parent
 )
SELECT * FROM getProductValue;

在此先感谢您的帮助! :)

最佳答案

我自己只用了一次递归就解决了。

WITH RECURSIVE getProductValue (i, n, par) AS 
(SELECT id as i, name as n, id as par FROM product
  UNION all 
        SELECT product.id AS i, product.name AS n, getProductValue.par 
        FROM product, getProductValue  
        WHERE product.parent=getProductValue.i)
SELECT par, SUM(value) 
FROM getProductValue, sales 
WHERE par<>i 
AND sales.product=getProductValue.i 
GROUP by par;

如果有人感兴趣,这就是解决方案!

关于sql - postgresQL 中子产品的递归列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40654457/

相关文章:

postgresql - Gitlab 500 错误:PG::ConnectionBad

postgresql - 如何在 BETWEEN 子句中插入 AVG?

haskell - 修复 OCaml 中的数据类型

mysql - 将数据从一个数据库移动到另一个具有不同数据结构的数据库

recursion - 汉诺塔 : Recursive Algorithm

algorithm - 使用Python和DFS算法的递归深度问题

Mysql根据不同表的日期时间过滤数据

sql - oracle:按日期和时间戳排序

mysql - 基于外键删除条目的最有效方法

sql - 使用 Oracle SQL 选择生日在给定范围内的员工