我用CTE写了一个SP。
CREATE PROC [dbo].[CategoryListShow]
@id AS INT
AS
WITH CategoryList
AS
(
SELECT parent.Categoryid, CONVERT(varchar(50),parent.CategoryName)
as
Name, parent.CategoryParentid
FROM Category as parent
WHERE parent.CategoryParentid IS NULL
UNION ALL
SELECT child.Categoryid, CONVERT(varchar(50),CL.Name + ' > ' + child.CategoryName)
as Name, child.CategoryParentid
FROM Category as child
INNER JOIN CategoryList as CL ON child.CategoryParentid = CL.Categoryid
WHERE child.CategoryParentid IS NOT NULL
)
SELECT Name from CategoryList option (maxrecursion 0)
如何才能达到想要的输出?例如,如果用户输入
id = 14111
,则输出应为:Everything Else > Test Auctions > General
我的表格结构:
谢谢
你可以这样做
;with
CTE_Data as
(
select C.CategoryID, cast(C.CategoryName as nvarchar(max)) as CategoryName
from Category as C
where C.CategoryID = C.CategoryParentId
union all
select C.CategoryID, CD.CategoryName + ' > ' + C.CategoryName
from Category as C
inner join CTE_Data as CD on CD.CategoryID = C.CategoryParentId
where C.CategoryID <> C.CategoryParentId
)
select *
from CTE_Data
where CategoryID = @ID
或者反过来:
;with
CTE_Data as
(
select C.CategoryID, cast(C.CategoryName as nvarchar(max)) as CategoryName, C.CategoryParentId
from Category as C
where C.CategoryID = @ID
union all
select C.CategoryID, cast(C.CategoryName as nvarchar(max)) + ' > ' + CD.CategoryName, C.CategoryParentId
from Category as C
inner join CTE_Data as CD on CD.CategoryParentId = C.CategoryID
where CD.CategoryID <> C.CategoryID
)
select CategoryName
from CTE_Data
where CategoryID = CategoryParentId