SQL检索树结构查询

时间:2013-06-29 13:24:31

标签: sql sql-server-2008-r2 sql-server-2012

我有2张桌子

Products表:

ID     ProductName    Category
0      T-Shirt        15
1      Aqua De Gio    12
2      Jacket         15
3      Hot Water      13

Categories表:

categoryID catagoryName       highercategoryID
8          Fragnance          0
99         Clothing           0
15         Armani Clothing    99
12         Armani Fragnance   8
102        Davidoff Fragnance 8

预期结果

ID     ProductName    Category  CategoryTree 
0      T-Shirt        15        Clothing > Armani Cloting
1      Aqua De Gio    12        Fragnance > Armani Fragnance
2      Jacket         15        Clothing > Armani Cloting
3      Hot Water      13        Fragnance > Davidoff Fragnance

例如,从产品表中取出T恤

  1. 其类别为15。
  2. 转到类别表,查看categoryID = 15
  3. 的位置
  4. 如果它的= 0停止则查看highercategoryID,如果不是,则取其值99
  5. 在categoryID列中查找99,较高的类别现在为0,因此停止。 基于以上所述,我需要获得“服装> Armani服装”。
  6. 我是SQL查询的新手,这是我第一次尝试

    select  
        x.*,
        x.p1 + isnull((' > ' + x.c1), '') + isnull((' > ' + x.c2), '') as CategoryTree 
    from 
        (select 
             RP.categoryid as catid,
             RP.catagoryName    as p1,
             R1.catagoryName    as c1,
             R2.catagoryName    as c2
         from 
             categories as RP
         left outer join 
             categories as R1 on R1.highercategoryid = RP.categoryid
         left outer join 
             categories as R2 on R2.highercategoryid = R1.categoryid 
         left outer join 
             categories as R3 on R3.highercategoryid = R2.categoryid 
         where 
             RP.highercategoryid != 0 ) x 
    

    当我在较高类别中找到0值以及如何在其类别中加入产品时,我不确定如何停止加入,并且是否存在动态方式而不使用大量连接?

1 个答案:

答案 0 :(得分:4)

这就是:

With CTE (CatID, CatName, HigherCatID) AS
(
  SELECT categoryID, CAST(catagoryName AS VARCHAR(1000)), highercategoryID
  FROM CATEGORIES
  UNION ALL
  SELECT C.categoryID, CAST(CTE.CatName + ' > ' + C.catagoryName AS VARCHAR(1000)), CTE.HigherCatID
  FROM CATEGORIES C
  INNER JOIN CTE ON C.HigherCategoryID = CTE.CatID
)
SELECT P.ID, P.ProductName, Cte.CatID, CTE.CatName
FROM CTE INNER JOIN PRODUCTS P
ON (CatID = P.Category)
WHERE CTE.HigherCatID=0 

你有一个SQLFiddle Here