34,594
社区成员
发帖
与我相关
我的任务
分享
CREATE TABLE [dbo].[controlset](
[id] [int] IDENTITY(1,1) NOT NULL,
[parentid] [int] NULL,
[controlname] [varchar](300) NULL,
[displayorder] [int] NULL,
CONSTRAINT [PK_controlset] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO controlset VALUES(0,'a',1)
INSERT INTO controlset VALUES(1,'b',2)
INSERT INTO controlset VALUES(1,'c',3)
INSERT INTO controlset VALUES(1,'d',4)
INSERT INTO controlset VALUES(0,'e',2)
INSERT INTO controlset VALUES(5,'f',1)
INSERT INTO controlset VALUES(1,'g',5)
INSERT INTO controlset VALUES(5,'h',2)
IF object_id('tempdb..#controlset') IS NOT NULL DROP TABLE #controlset
go
CREATE TABLE #controlset(
[id] [int] IDENTITY(1,1) NOT NULL,
[parentid] [int] NULL,
[controlname] [varchar](300) NULL,
[displayorder] [int] NULL)
INSERT INTO #controlset VALUES(0,'a',1)
INSERT INTO #controlset VALUES(1,'b',2)
INSERT INTO #controlset VALUES(1,'c',3)
INSERT INTO #controlset VALUES(1,'d',4)
INSERT INTO #controlset VALUES(0,'e',2)
INSERT INTO #controlset VALUES(5,'f',1)
INSERT INTO #controlset VALUES(1,'g',5)
INSERT INTO #controlset VALUES(5,'h',2)
INSERT INTO #controlset VALUES(3,'h',1)
INSERT INTO #controlset VALUES(3,'h',2)
--INSERT INTO #controlset VALUES(10,'x',10)
--INSERT INTO #controlset VALUES(11,'y',11)
--INSERT INTO #controlset VALUES(6,'z',8)
--SELECT * FROM #controlset
--sql:
;WITH cte AS
(
SELECT
nodeid=ROW_NUMBER() OVER(ORDER BY parentid, id),
[level] = 1, id, parentid, controlname, displayorder
FROM #controlset WHERE parentid IN(SELECT id FROM #controlset WHERE parentid=0) --从第二层子节点开始递归
UNION ALL
SELECT
nodeid, [level] = [level]+1, b.id, b.parentid, b.controlname, b.displayorder
FROM cte a
INNER JOIN #controlset b
ON a.id = b.parentid
)
SELECT id,parentid,controlname,displayorder FROM
(
SELECT nodeid,[level],id,parentid,controlname,displayorder FROM cte
UNION ALL
SELECT
nodeid=(SELECT TOP(1) b.nodeid FROM cte b WHERE b.parentid = a.id), --找到根节点的第一个子节点的nodeid
[level]=0,id,parentid,controlname,displayorder
FROM #controlset a WHERE parentid=0 --把根节点UNION ALL进来,并控制好它的nodeid
) t
ORDER BY nodeid,[level], id --按根节点,节点所在的级别,同级别内按id排序
/*
id parentid controlname displayorder
1 0 a 1
2 1 b 2
3 1 c 3
9 3 h 1
10 3 h 2
4 1 d 4
7 1 g 5
5 0 e 2
6 5 f 1
8 5 h 2
*/
IF object_id('tempdb..#controlset') IS NOT NULL DROP TABLE #controlset
go
CREATE TABLE #controlset(
[id] [int] IDENTITY(1,1) NOT NULL,
[parentid] [int] NULL,
[controlname] [varchar](300) NULL,
[displayorder] [int] NULL)
INSERT INTO #controlset VALUES(0,'a',1)
INSERT INTO #controlset VALUES(1,'b',2)
INSERT INTO #controlset VALUES(1,'c',3)
INSERT INTO #controlset VALUES(1,'d',4)
INSERT INTO #controlset VALUES(0,'e',2)
INSERT INTO #controlset VALUES(5,'f',1)
INSERT INTO #controlset VALUES(1,'g',5)
INSERT INTO #controlset VALUES(5,'h',2)
INSERT INTO #controlset VALUES(3,'h',1)
INSERT INTO #controlset VALUES(3,'h',2)
--sql:
;WITH cte AS
(
SELECT
rootid=ROW_NUMBER() OVER(ORDER BY id), --根节点id
[level] = 1,* --节点的级别
FROM #controlset WHERE parentid = 0
UNION ALL
SELECT rootid, [level] = [level]+1, b.*
FROM cte a
INNER JOIN #controlset b
ON a.id = b.parentid
)
SELECT id,parentid,controlname,displayorder FROM cte
ORDER BY rootid, [level], id --按根节点,节点所在的级别,同级别内按id排序
结果是:
1 0 a 1
2 1 b 2
3 1 c 3
4 1 d 4
7 1 g 5
9 3 h 1
10 3 h 2
5 0 e 2
6 5 f 1
8 5 h 2
正确的应该是
1 0 a 1
2 1 b 2
3 1 c 3
9 3 h 1
10 3 h 2
4 1 d 4
7 1 g 5
5 0 e 2
6 5 f 1
8 5 h 2
是一层一层的显示出子项,如果有子子项的话,先显示出子子项,再显示子项。是我没说清楚。