我正在使用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
答案 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