SQL Server 实现递归查询

从SQL Server 2005开始,就可支持通用表表达式(CTE)创建递归查询。下面先创建一个测试表和一些测试数据

1.创建一个测试表。

USE [MASTER]
CREATE TABLE [dbo].[TB_COLUMN_TEST](
    [F_ID] [int] NOT NULL,
    [F_NAME] [nvarchar](20) NOT NULL,
    [F_DESC] [nvarchar](100) NULL,
    [F_PARENTID] [int] NULL
) ON [PRIMARY]
GO

2.新增一些测试数据,并查看表数据。

DELETE [TB_COLUMN_TEST]
INSERT INTO [TB_COLUMN_TEST] VALUES (1,'测试栏目1','测试栏目描述1',NULL)
INSERT INTO [TB_COLUMN_TEST] VALUES (2,'测试栏目2','测试栏目描述2',NULL)
INSERT INTO [TB_COLUMN_TEST] VALUES (3,'测试栏目1-1','测试栏目描述1-1',1)
INSERT INTO [TB_COLUMN_TEST] VALUES (4,'测试栏目1-2','测试栏目描述1-2',1)
INSERT INTO [TB_COLUMN_TEST] VALUES (5,'测试栏目1-1-1','测试栏目描述1-1-1',3)
INSERT INTO [TB_COLUMN_TEST] VALUES (6,'测试栏目1-1-2','测试栏目描述1-1-2',3)
INSERT INTO [TB_COLUMN_TEST] VALUES (7,'测试栏目1-2-1','测试栏目描述1-2-1',4)
INSERT INTO [TB_COLUMN_TEST] VALUES (8,'测试栏目1-2-2','测试栏目描述1-2-2',4)
INSERT INTO [TB_COLUMN_TEST] VALUES (9,'测试栏目1-1-1-1','测试栏目描述1-1-1-1',5)
INSERT INTO [TB_COLUMN_TEST] VALUES (10,'测试栏目1-1-1-2','测试栏目描述1-1-1-2',5)
SELECT * FROM [TB_COLUMN_TEST]

3.查询“测试栏目1”下面所有子栏目

WITH TEMP(F_ID,F_NAME,F_DESC,F_PARENTID)
AS
(
    --SELECT F_ID,F_NAME,F_DESC,F_PARENTID FROM [TB_COLUMN_TEST] WHERE F_PARENTID=1  --不包括自己
    SELECT F_ID,F_NAME,F_DESC,F_PARENTID FROM [TB_COLUMN_TEST] WHERE F_ID=1 --包括自己
    UNION ALL
    SELECT A.F_ID,A.F_NAME,A.F_DESC,A.F_PARENTID FROM [TB_COLUMN_TEST] A
    INNER JOIN TEMP B 
    ON A.F_PARENTID = B.F_ID
)
SELECT F_ID,F_NAME,F_DESC,F_PARENTID FROM TEMP

查询结果:

原文地址:https://www.cnblogs.com/tracine0513/p/8547957.html