是有點凌亂,但:
DROP TABLE #Sale
GO
DROP TABLE #PRoduct
GO
DROP TABLE #ProductCategory
GO
DROP TABLE #Category
GO
CREATE TABLE #Sale
(
ID INT,
Name VARCHAR(20)
)
GO
INSERT INTO #Sale SELECT 1, 'Sale1'
GO
CREATE TABLE #Product
(
ID INT,
saleidfk INT,
name VARCHAR(20)
)
GO
INSERT INTO #Product
SELECT 1,1,'a'
UNION
SELECT 2,1,'b'
UNION
SELECT 3,1,'c'
UNION
SELECT 4,1,'d'
UNION
SELECT 5,1,'e'
UNION
SELECT 6,1,'f'
GO
CREATE TABLE #ProductCategory
(
ProductID INT,
CategoryID INT
)
GO
INSERT INTO #ProductCategory
SELECT 1,3
UNION
SELECT 2,3
UNION
SELECT 3,4
UNION
SELECT 4,5
UNION
SELECT 5,10
UNION
SELECT 6,10
GO
CREATE TABLE #Category
(
ID INT,
ParentCategoryFK INT,
Name varchar(20)
)
GO
INSERT INTO #Category
SELECT 1,NULL,'Men'
UNION
SELECT 2,1,'Shoes'
UNION
SELECT 3,2,'Sport'
UNION
SELECT 4,2,'Casual'
UNION
SELECT 5,1,'Watches'
UNION
SELECT 6,NULL,'Women'
UNION
SELECT 7,6,'Shoes'
UNION
SELECT 8,7,'Sport'
UNION
SELECT 9,7,'Casual'
UNION
SELECT 10,6,'Watches'
GO
WITH Categories (CategoryName,CategoryID, [Level], SortOrder) AS
(
SELECT Cat.Name,cat.id, 1 AS [Level], CONVERT(VARCHAR(MAX), ROW_NUMBER() OVER (order by cat.Name)) AS SortOrder
FROM #Category Cat
WHERE Cat.ParentCategoryFK IS NULL
UNION ALL
SELECT CAT.Name,cat.ID, [Level] + 1, c2.SortOrder + CONVERT(VARCHAR(MAX), ROW_NUMBER() OVER (order by cat.Name))
FROM #Category CAT
INNER JOIN Categories c2 ON cat.ParentCategoryFK = c2.CategoryID
)
SELECT #Sale.Name, Categories.CategoryName, #Product.name,Categories.Level,Categories.SortOrder FROM
Categories
LEFT JOIN
#ProductCategory ON #ProductCategory.CategoryID = Categories.CategoryID
LEFT JOIN
#Product ON #Product.ID = #ProductCategory.ProductID
LEFT JOIN
#Sale ON #Product.saleidfk = #Sale.ID
ORDER BY Categories.SortOrder, #Product.name
的相關要點需要注意是,以獲得完整的層次是有道理的,你需要的類別是否有產品或沒有。此外,SortOrder的varchar允許層次結構以正確的順序顯示。
也許你可以獲得基本模式獲得父子記錄從孩子開始使用這種方法:http: //stackoverflow.com/questions/1104977/how-to-get-the-parent-given-a-child-in-sql-server-2005/1107901#1107901 – 2010-04-12 03:52:33
或者如果你想從上到下,檢查模式這裏:http://stackoverflow.com/questions/1686340 – 2010-04-12 03:54:16