2011-01-27 1 views
0

Фон: У меня есть 3 таблицы MSSQLServer: product, category, product_category_mapping. над продуктом находится до 5 уровней категорий, и эти данные хранятся в таблице сопоставлений. Что я хочу сделать, это перебирать продукты и для каждого уровня категории продукта, создать новое сопоставление для этого продукта против текущего уровня.Итерация SQL, хотя несколько уровней иерархии parent/child

Я начал с этого вопроса и думал, что смогу его развить, поставив курсоры на каждом этапе категории, где я буду выполнять вставку. Как только я начал с трудом размахивать головой, теперь мне интересно, может ли это даже самый лучший способ сделать это - может ли кто-нибудь показать мне лучший способ сделать это?

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

Какие РСУБД? MSSQLServer? –

+0

Какую базу данных вы используете? –

+0

В дополнение к комментарию от @Pablo - вы можете разместить некоторые образцы DDL и данных? – codingbadger

ответ

2

Если это Microsoft SQL Server, вы можете попробовать использовать CTE (Common Table Expressions) for recursive queries.

Если у вас есть PostgreSQL, у вас также есть support for recursive queries.

Here's как это сделать в Oracle.

+0

aag извините, это MSSQL2008 R2 – markpsmith

+0

OK. Тогда взгляните на CTE. Удачи! –

+1

Спасибо, Пабло, я попробовал работать с CTE. – markpsmith