日期:2014-05-17  浏览次数:20491 次

sqlServer查询 ,求帮助
栏目ID 栏目名称         上级栏目ID      下级栏目ID
ID catname   arrP_id   arrC_id
14 政务公开           0             14,15,16,17,20,19,21,18,22,23,24,25,26
15 云南省政府自身建设 0,14         15,16,17,20,19,21,18,22,23,24,25,26
16 时政新闻    0,14,15         16
17 四项制度           0,14,15         17,20,19,21,18
18 效能政府           0,14,15,17 18
19 责任政府           0,14,15,17 19
20 法制政府           0,14,15,17 20
21 阳光政府           0,14,15,17 21
22 政务信息           0,14,15         22,23,24,25,26
23 政府信息公开       0,14,15,22 23
24 重大决策听证 0,14,15,22 24
25 重要事项公示 0,14,15,22 25
26 重点工作通报 0,14,15,22 26
查询结果为以下:
政务公开 云南省政府自身建设 NULL 时政新闻
政务公开 云南省政府自身建设 NULL 四项制度
政务公开 云南省政府自身建设 NULL 政务信息
政务公开 云南省政府自身建设 四项制度 效能政府
政务公开 云南省政府自身建设 四项制度 责任政府
政务公开 云南省政府自身建设 四项制度 法制政府
政务公开 云南省政府自身建设 四项制度 阳光政府
政务公开 云南省政府自身建设 政务信息 政府信息公开
政务公开 云南省政府自身建设 政务信息 重大决策听证
政务公开 云南省政府自身建设 政务信息 重要事项公示
政务公开 云南省政府自身建设 政务信息 重点工作通报
请问sql语句如何实现, 如果sql语句不能实现,c#代码里实现也可.
注:是sqlserver 数据库.

sql sqlserver

------解决方案--------------------
USE test
GO

-->生成表tb

if object_id('tb') is not null 
drop table tb
Go
Create table tb([ID] smallint,[catname] nvarchar(9),[arrP_id] nvarchar(11),[arrC_id] nvarchar(38))
Insert into tb
Select 14,N'政务公开',N'0',N'14,15,16,17,20,19,21,18,22,23,24,25,26'
Union all Select 15,N'云南省政府自身建设',N'0,14',N'15,16,17,20,19,21,18,22,23,24,25,26'
Union all Select 16,N'时政新闻',N'0,14,15',N'16'
Union all Select 17,N'四项制度',N'0,14,15',N'17,20,19,21,18'
Union all Select 18,N'效能政府',N'0,14,15,17',N'18'
Union all Select 19,N'责任政府',N'0,14,15,17',N'19'
Union all Select 20,N'法制政府',N'0,14,15,17',N'20'
Union all Select 21,N'阳光政府',N'0,14,15,17',N'21'
Union all Select 22,N'政务信息',N'0,14,15',N'22,23,24,25,26'
Union all Select 23,N'政府信息公开',N'0,14,15,22',N'23'
Union all Select 24,N'重大决策听证',N'0,14,15,22',N'24'
Union all Select 25,N'重要事项公示',N'0,14,15,22',N'25'
Union all Select 26,N'重点工作通报',N'0,14,15,22',N'26'


IF object_id('tempdb..#Result')IS NOT NULL
DROP TABLE #Result
;WITH t1 AS (
SELECT
a.*
,SUBSTRING(a.arrP_id,c.number,b.number-c.number+1) AS col
FROM tb AS a
INNER JOIN master.dbo.spt_values AS b ON SUBSTRING(a.arrP_id+',',b.number+1,1)=',' AND b.type='P'
CROSS APPLY(SELECT MAX(number) AS number FROM master.dbo.spt_values AS x 
WHERE SUBSTRING(','+a.arrP_id,x.number,1)=',' 
AND x.number<=b.number AND