我正在嘗試遍歷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上向下鑽取子boms。
在代碼中(從OpenERP的)當孩子沒有找到物料清單(無bom_id)子產品中搜索基礎上的product_id:
sids = bom_obj.search(cr, uid, [('bom_id','=',False),('product_id','=',bom.product_id.id)])
我想知道如果有一個方法,我可以用來在SQL中完成同樣的事情。一旦CTE不返回行,請檢查product_id和空bom_id。我曾想過另一個遞歸成員,但我不認爲這就是我正在尋找的。
我知道我的問題可能不是很清楚,但是,有什麼建議嗎?
這裏SQL小提琴示例數據:http://sqlfiddle.com/#!3/b9052/1
不完全;它會返回一個重複的子行。 – ehcanadian
我懷疑我錯了'WHERE NOT EXISTS(SELECT * FROM mrp_bom mb WHERE mb.bom_id = b.ID)'你能創建一些樣本數據嗎? [SQL小提琴](http://sqlfiddle.com/)也不錯。 –
這對你有幫助嗎?我以前沒有使用SQL Fiddle。 http://sqlfiddle.com/#!3/b9052/1(編輯的網址) – ehcanadian