Sql 单次查询中记录的分层检索

Sql 单次查询中记录的分层检索,sql,postgresql,common-table-expression,recursive-query,Sql,Postgresql,Common Table Expression,Recursive Query,我正在使用PostgreSQL 9.2。我有一个产品表,其中存储了有关产品的信息,其子表是content table,其中包含链接到它的产品 假设,例如,如果我在主表中有一个名为Burger的产品,那么我将拥有它的内容 产品如 bread,cheese,chilli. 他们可以是这样一种场景:面包是主要产品,其内容物是面粉和盐等 我正在编写一个查询,以检索与其内容产品相关联的所有ProductSID,这些内容产品应该显示类似于此层次结构的内容 Burger----bread--+----fl

我正在使用PostgreSQL 9.2。我有一个产品表,其中存储了有关产品的信息,其子表是content table,其中包含链接到它的产品

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

 bread,cheese,chilli.
他们可以是这样一种场景:面包是主要产品,其内容物是面粉和盐等

我正在编写一个查询,以检索与其内容产品相关联的所有ProductSID,这些内容产品应该显示类似于此层次结构的内容

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

这是一个教科书上的例子:

很像这个:


如果有循环依赖项,查询将陷入无休止的循环中,最终引发异常。如果可能发生这种情况,请添加某种中断条件。就像我作为注释添加的最大迭代级别一样。或外部SELECT的限制n,这也会使CTE在检索到足够的行后立即停止循环

我认为这个问题在StackOverflow或DBA上会更好。不管怎样,您是否尝试过递归CTE?如果您不看.A表定义和一些示例值中的WITH RECURSIVE语句,您将非常乐意回答这样的问题。
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;