22,210
社区成员
发帖
与我相关
我的任务
分享
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([code] nvarchar(21),[name] nvarchar(25),[parentCode] nvarchar(21),[orderBy] int)
Insert #T
select N'A',N'信息1',null,2 union all
select N'B',N'信息2',null,1 union all
select N'C',N'信息1_1',N'A',1 union all
select N'D',N'信息1_2',N'A',2 union all
select N'E',N'信息2_2',N'B',2 union all
select N'F',N'信息2_1',N'B',1
Go
--测试数据结束
;WITH cte AS (
SELECT *,code AS groupcode FROM #T WHERE parentCode IS NULL
UNION ALL
SELECT #T.*,cte.groupcode FROM #T JOIN cte ON cte.Code = #T.parentCode
)
SELECT * FROM cte ORDER BY CASE WHEN groupcode='B' THEN 0 ELSE 1 END,groupcode,orderBy
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([code] nvarchar(21),[name] nvarchar(25),[parentCode] nvarchar(21),[orderBy] int)
Insert #T
select N'A',N'信息1',null,2 union all
select N'B',N'信息2',null,1 union all
select N'C',N'信息1_1',N'A',1 union all
select N'D',N'信息1_2',N'A',2 union all
select N'E',N'信息2_2',N'B',2 union all
select N'F',N'信息2_1',N'B',1
Go
如果我把测试数据改成这样的,但是要让code列为B的按照OrderBy列排在前面。
use Tempdb
go
--> --> 听雨停了-->测试数据
if not object_id(N'Tempdb..#tab') is null
drop table #tab
Go
Create table #tab([code] nvarchar(21),[name] nvarchar(25),[parentCode] nvarchar(21),[orderBy] int)
Insert #tab
select N'A',N'信息1',null,1 union all
select N'B',N'信息2',null,2 union all
select N'C',N'信息1_1',N'A',1 union all
select N'D',N'信息1_2',N'A',2 union all
select N'X',N'信息1_1_1',N'C',1 union all
select N'Y',N'信息1_1_2',N'C',2 union all
select N'E',N'信息2_2',N'B',2 union all
select N'F',N'信息2_1',N'B',1
--测试数据结束
WITH cte AS (
SELECT *,cast(orderBy AS VARCHAR(200)) AS new_num FROM #tab WHERE ISNULL(parentcode,'')=''
UNION ALL
SELECT a.*,cast(b.new_num +CAST(a.orderBy AS varchar(200)) AS VARCHAR(200)) FROM #tab a
INNER JOIN cte b ON a.parentcode=b.code
)
SELECT * FROM cte
ORDER BY new_num
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([code] nvarchar(21),[name] nvarchar(25),[parentCode] nvarchar(21),[orderBy] int)
Insert #T
select N'A',N'信息1',null,1 union all
select N'B',N'信息2',null,2 union all
select N'C',N'信息1_1',N'A',1 union all
select N'D',N'信息1_2',N'A',2 union all
select N'E',N'信息2_2',N'B',2 union all
select N'F',N'信息2_1',N'B',1
Go
--测试数据结束
;WITH cte AS (
SELECT *,code AS groupcode FROM #T WHERE parentCode IS NULL
UNION ALL
SELECT #T.*,cte.groupcode FROM #T JOIN cte ON cte.Code = #T.parentCode
)
SELECT * FROM cte ORDER BY groupcode,orderBy
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([code] nvarchar(21),[name] nvarchar(25),[parentCode] nvarchar(21),[orderBy] int)
Insert #T
select N'A',N'信息1',null,2 union all
select N'B',N'信息2',null,1 union all
select N'C',N'信息1_1',N'A',1 union all
select N'D',N'信息1_2',N'A',2 union all
select N'E',N'信息2_2',N'B',2 union all
select N'F',N'信息2_1',N'B',1
Go
WITH CTE
AS
(select *,0 as sub_orderby,orderby as main_orderby from #T A WHERE parentCode IS NULL
UNION ALL
select A.*,A.orderby,B.main_orderby
from #T A
JOIN CTE B ON B.code=A.parentCode)
select * from CTE
order by main_orderby,sub_orderby