sqlServer查询 ,求帮助
栏目ID栏目名称 上级栏目ID 下级栏目ID
IDcatname 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,1718
19责任政府 0,14,15,1719
20法制政府 0,14,15,1720
21阳光政府 0,14,15,1721
22政务信息 0,14,15 22,23,24,25,26
23政府信息公开 0,14,15,2223
24重大决策听证0,14,15,2224
25重要事项公示0,14,15,2225
26重点工作通报0,14,15,2226
查询结果为以下:
政务公开云南省政府自身建设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 x.type='P'
) AS c
)
SELECT
a.ID
,a.catname
,ROW_NUMBER()OVER(PARTITION BY a.ID ORDER BY col) AS row
,b.catname AS Parent_catname
INTO #Result
FROM t1 AS a
INNER JOIN tb AS b ON a.col=b.ID
SELECT
MAX(CASE WHEN row=1 THEN Parent_catname END) AS Col1
,MAX(CASE WHEN row=2 THEN Parent_catname END) AS Col2
,MAX(CASE WHEN row=3 THEN Parent_catname END) AS Col3
,catname AS Col4
FROM #Result AS a
WHERE EXISTS(SELECT 1 FROM #Result AS x
WHERE x.ID=a.ID
AND x.row>1
)
GROUP BY catname
ORDER BY MAX(row) ASC,MIN(ID) ASC
/*
Col1 Col2 Col3 Col4
--------- ------------------- -------- -------------
政务公开 云南省政府自身建设 NULL 时政新闻
政务公开 云南省政府自身建设 NULL 四项制度
政务公开 云南省政府自身建设 NULL 政务信息
政务公开 云南省政府自身建设 四项制度 效能政府
政务公开 云南省政府自身建设 四项制度 责任政府
政务公开 云南省政府自身建设 四项制度 法制政府
政务公开 云南省政府自身建设 四项制度 阳光政府
政务公开 云南省政府自身建设 政务信息 政府信息公开
政务公开 云南省政府自身建设 政务信息 重大决策听证
政务公开 云南省政府自身建设 政务信息 重要事项公示
政务公开 云南省政府自身建设 政务信息 重点工作通报
*/
[解决办法]
你去C#里面问好了,这个C#比较好实现,前不久我用delphi的TreeViews组件整过类似的。不知道C#没有么TreeViews