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 にドリルダウンするため、クエリは期待どおりに機能します。
子 BoM が見つからない (bom_id がない) 場合のコード (OpenERP から) では、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