SQL迭代虽然有几个级别的父/子层次结构

时间:2011-01-27 17:05:17

标签: sql recursion hierarchical-data

背景:我有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)))))

1 个答案:

答案 0 :(得分:2)

如果是Microsoft SQL Server,您可以尝试使用CTE (Common Table Expressions) for recursive queries

如果是PostgreSQL,你也有support for recursive queries

Here's如何在Oracle中完成。