22,300
社区成员




--> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[parent_id] [int],[value] [int])
INSERT INTO [tb]
SELECT '1','0','0' UNION ALL
SELECT '2','0','0' UNION ALL
SELECT '3','1','1' UNION ALL
SELECT '4','2','1' UNION ALL
SELECT '5','1','2'
--SELECT * FROM [tb]
-->SQL查询如下:
;WITH t AS
(
SELECT *, px = CAST(ROW_NUMBER()OVER(ORDER BY VALUE DESC) AS VARBINARY)
FROM tb
WHERE parent_id = 0
UNION ALL
SELECT a.*, CAST(
px+CAST(
ROW_NUMBER()OVER(PARTITION BY a.parent_id ORDER BY a.VALUE DESC) AS VARBINARY
) AS VARBINARY
)
FROM tb a, t b
WHERE a.parent_id = b.id
)
SELECT id
FROM t
ORDER BY px
/*
id
-----------
1
5
3
2
4
(5 行受影响)
*/
IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
GO
CREATE TABLE TB(id INT, parent_id INT, value INT)
INSERT INTO TB
SELECT 1, 0, 0 UNION ALL
SELECT 2, 0, 0 UNION ALL
SELECT 3, 1, 1 UNION ALL
SELECT 4, 2, 1 UNION ALL
SELECT 5, 1, 2
;WITH MU AS (
SELECT 'LEVEL'=1,NID=ID,* FROM TB WHERE parent_id=0
UNION ALL
SELECT [LEVEL]+1,NID,TB.*
FROM TB
INNER JOIN MU ON TB.parent_id =MU.id
)
SELECT ID FROM MU
ORDER BY NID,LEVEL ASC,value DESC
/*
1
5
3
2
4
*/