我正在尝试使用 CTE 遍历层次结构,它在一种情况下工作正常,但在另一种情况下却不行,这就是我卡住的地方。
给定查询;
;WITH BOMcte (ID, Code, BomName , ProductID, ProductCode, ProductName , ParentAssemblyID )
AS
(
SELECT b.id,
b.code,
b.name,
p.id,
p.default_code,
p.name_template,
b.bom_id
FROM mrp_bom AS b
INNER JOIN product_product p on b .product_id = p.id
WHERE b. bom_id IS NULL
and b.id = @AssemblyID
UNION ALL
SELECT b.id,
b.code,
b.name,
p.id,
p.default_code,
p.name_template,
b.bom_id
FROM mrp_bom AS b
INNER JOIN product_product p on b .product_id = p.ID
INNER JOIN BOMcte AS cte ON b.bom_id = cte.ID
)
SELECT BoM.* FROM BOMcte BoM
该查询的工作方式与我预期的一样,因为 BoM 向下钻取到 bom_id 列上的子 bom。
在代码(来自 OpenERP)中,当未找到子 BoM 时,(无 bom_id)根据 product_id 搜索子产品:
sids = bom_obj.search(cr, uid, [('bom_id','=',False),('product_id','=',bom.product_id.id)])
我想知道是否有一种方法可以用来在 SQL 中完成同样的事情。一旦 CTE 不返回行,请检查 product_id 和 null bom_id。我曾考虑过另一个递归成员,但我认为这不是我想要的。
我知道我的问题可能不是很清楚,但是有什么建议吗?
SQL Fiddle 示例数据:http://sqlfiddle.com/#!3/b9052/ 1