Попробуйте это:
CREATE table #Category(
id INT NOT NULL,
name VARCHAR(20) NOT NULL,
parentid INT NOT NULL
)
INSERT INTO #Category (id, name, parentid) VALUES
(1, 'parts', 1),
(2, 'processor', 1),
(3, 'AMD', 2),
(4, 'Intel', 2),
(5, 'Hard Disk', 1),
(6, 'Memory', 1),
(7, 'DDR1', 6),
(8, 'DDR2', 6),
(9, 'DDR3', 6),
(10, '533Mhz', 7),
(11, '667Mhz', 8),
(12, '800Mhz', 8)
CREATE table #Items(
id INT NOT NULL,
name VARCHAR(20) NOT NULL,
categoryId INT NOT NULL
)
INSERT INTO #Items (id, name, categoryId) VALUES
(1, 'AMD Phenom', 3),
(2, 'AMD Sempron', 3),
(3, 'AMD Athlon', 3),
(4, 'Intel core 2 duo', 4),
(5, 'Intel core i3', 4),
(6, 'DDR2 1GB 6667Mhz', 11),
(7, 'Intel 8080', 4),
(8, 'Intel 80286', 4),
(9, 'Intel 80386', 4),
(10, 'Intel 80486', 4),
(11, 'Intel Pentuim', 4),
(12, 'Intel Pentium I', 4)
DECLARE @TopLevelId INT; -- top level category Id
SET @TopLevelId = 2; -- top level category = AMD processors
WITH CTE AS
(SELECT id, name, parentid, id as Adam, 1 as level
FROM #Category
WHERE id = @TopLevelId
UNION ALL
SELECT #Category.id, #Category.name, #Category.parentid, CTE.Adam, CTE.level + 1
FROM #Category
INNER JOIN CTE ON
#Category.parentid = CTE.id
WHERE #Category.id <> @TopLevelId
)
SELECT CTE.id CategoryId, CTE.name as Category, #Items.name as Item
FROM CTE
INNER JOIN #Items ON
CTE.id = #Items.categoryId
ORDER BY level, CTE.id
DROP table #Category
DROP table #Items