T-SQL查询:获取父节点的子节点

Jos*_*san 1 sql t-sql sql-server

我有一个包含以下架构的表:

ID , CatID, ParentCatID, SiteID
Run Code Online (Sandbox Code Playgroud)

我想获得所有属于作为根的类别(意味着他们的ParentCatID = 0)及其所有后代的网站.

例如 :

ID , CatID, ParentCatID, SiteID
--------------------------------
1  , 2    , 0          , 3
1  , 4    , 2          , 6
1  , 5    , 4          , 7
Run Code Online (Sandbox Code Playgroud)

在此示例中,CatID 2是4的父级,4是5的父级.

如何获取属于根类别及其所有后代的所有SiteID.

OMG*_*ies 5

使用SQL Server 2005+支持递归公用表表达式:

WITH hierarchy AS (
  SELECT yt.id, 
         yt.catid,
         yt.parentcatid,
         yt.siteid
    FROM YOUR_TABLE yt
   WHERE yt.parentcatid = 0
  UNION ALL
  SELECT yt.id, 
         yt.catid,
         yt.parentcatid,
         yt.siteid
    FROM YOUR_TABLE yt
    JOIN hierarchy h ON h.catid = yt.catid)
SELECT t.*
  FROM hierarchy t
OPTION (maxrecursion 1000)
Run Code Online (Sandbox Code Playgroud)

如果你得到:

声明终止.在语句完成之前,最大递归100已用尽

默认值为100次递归.可以通过maxrecursion选项设置最大递归次数,最大值为32767.