背景:我有3个MSSQLServer表: product,category,product_category_mapping。产品上方最多有5个类别级别,此数据保存在映射表中。我要做的是遍历产品,并针对每个产品类别级别,为该产品创建一个针对当前级别的新映射。
我从这个查询开始,并认为我可以通过将游标放在每个类别阶段来开发它,我将在每个类别阶段执行插入。刚开始的时候,我发现很难让自己头脑清醒,现在我在想,这是不是最好的方法--有人能告诉我更好的方法吗?
SELECT DISTINCT p.ProductId,p.name
FROM Nop_Product p
INNER JOIN Nop_Product_Category_Mapping cm ON p.ProductId = cm.ProductID
INNER JOIN Nop_Category c ON cm.CategoryID = c.CategoryID
WHERE c.CategoryID in (
--next level
SELECT DISTINCT Nop_Category.CategoryID
FROM Nop_Product_Category_Mapping
INNER JOIN Nop_Category ON Nop_Product_Category_Mapping.CategoryID = Nop_Category.CategoryID
WHERE Nop_Category.ParentCategoryID in (
-- next level
SELECT DISTINCT Nop_Category.CategoryID
FROM Nop_Product_Category_Mapping
INNER JOIN Nop_Category ON Nop_Product_Category_Mapping.CategoryID = Nop_Category.CategoryID
WHERE Nop_Category.ParentCategoryID in (
-- next level
SELECT DISTINCT Nop_Category.CategoryID
FROM Nop_Product_Category_Mapping
INNER JOIN Nop_Category ON Nop_Product_Category_Mapping.CategoryID = Nop_Category.CategoryID
WHERE Nop_Category.ParentCategoryID in (
-- next level
SELECT DISTINCT Nop_Category.CategoryID
FROM Nop_Product_Category_Mapping
INNER JOIN Nop_Category ON Nop_Product_Category_Mapping.CategoryID = Nop_Category.CategoryID
WHERE Nop_Category.ParentCategoryID in (
--top level categories
SELECT Nop_Category.CategoryID
FROM Nop_Product_Category_Mapping
INNER JOIN Nop_Category ON Nop_Product_Category_Mapping.CategoryID = Nop_Category.CategoryID
WHERE Nop_Category.ParentCategoryID = 0)))))发布于 2011-01-28 01:09:36
如果是Microsoft SQL Server,您可以尝试使用CTE (Common Table Expressions) for recursive queries。
如果它是PostgreSQL,那么您也可以使用support for recursive queries。
Here's如何在Oracle中实现。
https://stackoverflow.com/questions/4819462
复制相似问题