我有一个类别表,可以分为两个级别:父类别和子类别,如果父类别为0 - 那么它是父类别,否则,它是一个子类别。任何有父母的子,但有些父母可能还没有子。
categoryID | categoryName | parentID
---------------------------------------------------
1 | cat 1 | 0 (parent cat)
2 | cat 2 | 1 (sub of #1)
我想要一张表,列出:
categoryID, categoryName, ParentCategoryID, parentCategoryName
如果我进行INNER JOIN,那么我就会失去没有潜艇的父猫。 例如:
SELECT
Sub.[categoryName] As SubcatName, Sub.categoryID,
Parent.[categoryName] As ParentCatName, Sub.[parentID] AS parentID
FROM
[tblCategories] Parent INNER JOIN [tblCategories] Sub
ON
Sub.[parentID] = Parent.[categoryID]
如果我执行LEFT OUTER JOIN(Parent - > Sub),那么我会将子类别作为父级进行。
如果我做LEFT OUTER JOIN(父母 - > Sub) - 那么我再次只获得那些有父母猫的类别。
有人可以建议查询语法吗?
答案 0 :(得分:2)
使用递归cte:
;with cte as (
-- anchor elements: where parentId = 0
select
categoryId
, categoryName
, parentId
, parentName = convert(varchar(32),null)
from t
where parentId = 0
-- recursion begins here
union all
select
c.categoryId
, c.categoryName
, c.parentId
, parentName = p.categoryName
from t c
inner join cte as p on c.parentId= p.categoryId
)
-- we select all the results
select *
from cte
答案 1 :(得分:1)
SELECT cat2.[categoryId]
,cat2.[categoryName]
,cat2.[parentid]
,cat1.categoryName
FROM [category] cat1
RIGHT JOIN [category] cat2
on cat2.parentid = cat1.categoryId