SQL Server 实现递归查询

时间:2022-09-19 10:56:10

从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]

SQL Server 实现递归查询

 

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

查询结果:

SQL Server 实现递归查询