单个查询中记录的分层检索

时间:2014-08-21 12:12:17

标签: sql postgresql common-table-expression recursive-query

我正在使用PostgreSQL 9.2。我有一个产品表,用于存储有关产品的信息,其子表是内容表,其中包含与之链接的产品。

假设例如如果我在主表中有一个名为Burger的产品,那么我将获得它的内容 产品如

 bread,cheese,chilli.

他们可能是面包将成为主要产品,其内容将是面粉和盐等。

我正在编写一个查询来检索所有产品(与它们相关联的ID)及其内容产品,这些产品应显示类似此层次结构的内容

Burger----bread--+----flour
                 +----salt
      ----cheese
      ----chilli

我必须得到像这样的结果

burger bread
burger cheese
burger chilli
bread  flour
bread  salt

这个层次结构可以运行到n级(就像偶数楼层可以有子内容一样,在这种情况下它应该是这样的

burger bread
burger cheese
burger chilli
bread  flour
bread  salt
flour  someprod1
flour someprod2   assuming if someprod1 and someprod2 are the contents)

我写了以下查询:

select rec.m_product_id,rec.m_productbom_id 
from rec_product_recipe  rec
join rec_product_recipe rec1
on rec1.m_productbom_id = rec.m_product_id

但这显示了一个级别:

burger bread
burger cheese
burger chilli

1 个答案:

答案 0 :(得分:0)

这是recursive CTE的教科书示例:

WITH RECURSIVE cte AS (
   SELECT 0 AS lvl, m_product_id, m_productbom_id
   FROM   rec_product_recipe
   WHERE  m_product_id = <id of burger> -- restrict to one root product

   UNION ALL
   SELECT c.lvl + 1, r.m_product_id, r.m_productbom_id
   FROM   cte  c
   JOIN   rec_product_recipe r ON r.m_product_id = c.m_productbom_id
   -- WHERE c.lvl < 10   -- protection against loops (optional)
   )
SELECT *
FROM   cte
ORDER  BY 1,2,3;

很像这个:

如果您有循环依赖关系,查询将陷入无限循环并最终引发异常。如果发生这种情况,请添加某种中断条件。就像我添加的最大迭代级别一样。或外LIMIT n的{​​{1}},一旦检索到足够的行,CTE也会停止循环。 Examples in the manual