从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
查询结果: