首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

sqlServer查询 ,求相助

2013-01-21 
sqlServer查询 ,求帮助栏目ID栏目名称上级栏目ID下级栏目IDIDcatnamearrP_idarrC_id14政务公开014,15,16,1

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

热点排行