sql - 自联接表的语法

时间:2017-03-07 19:25:59

标签: sql-server

我有一个类别表,可以分为两个级别:父类别和子类别,如果父类别为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) - 那么我再次只获得那些有父母猫的类别。

有人可以建议查询语法吗?

2 个答案:

答案 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

original entries