2013-06-29 172 views
1

我有2個表SQL檢索樹結構查詢

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-S希爾特從產品表

  1. 其類別爲15
  2. 去類別表,看看那裏的categoryID = 15
  3. 看看highercategoryID如果= 0停止,如果不是再取它的值99
  4. 在categoryID列中尋找99,現在較高的類別是0,所以停下來。 根據以上我需要得到「服裝>阿瑪尼服裝」。

我是新來的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值,以及如何加入產品在他們的類別中,並且有沒有使用大量聯接的動態方式?

回答

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

+0

+10是不夠的,謝謝。 – user2490355