27,579
社区成员
发帖
与我相关
我的任务
分享
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[areaname] nvarchar(22),[postcode] nvarchar(26),[iParent] int)
Insert #T
select 1,N'浙江',N'nulll',0 union all
select 10,N'杭州',N'315300',1 union all
select 3,N'宁波',N'315400',1 union all
select 4,N'温州',N'315500',1 union all
select 5,N'上海',null,0 union all
select 6,N'浦东',N'210013',5 union all
select 7,N'张江',N'210023',5 union all
select 8,N'北京',null,0 union all
select 9,N'海淀',N'100014',8 union all
select 11,N'海淀1',N'100014',9 union all
select 3,N'朝阳',N'100026',8
Go
--测试数据结束
;
WITH cte AS (
SELECT id,areaname,iParent,lvl=cast(1 as int)
,sort=cast(id as varchar(500))
FROM #T
WHERE iParent = 0
UNION ALL
SELECT #T.id,#T.areaname,#T.iParent,lvl=cast(cte.lvl+1 as int)
,sort=cast(concat(cte.sort,'/',#t.id) as varchar(500))
FROM cte
INNER JOIN #T ON cte.Id = #T.iParent
)
SELECT areaname=REPLICATE(' ',lvl-1)+areaname
FROM cte ORDER BY cte.sort
areaname
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
浙江
杭州
宁波
温州
上海
浦东
张江
北京
朝阳
海淀
海淀1
(11 行受影响)
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([id] int,[areaname] nvarchar(22),[postcode] nvarchar(26),[iParent] int)
Insert #T
select 1,N'浙江',N'nulll',0 union all
select 2,N'杭州',N'315300',1 union all
select 3,N'宁波',N'315400',1 union all
select 4,N'温州',N'315500',1 union all
select 5,N'上海',null,0 union all
select 6,N'浦东',N'210013',5 union all
select 7,N'张江',N'210023',5 union all
select 8,N'北京',null,0 union all
select 9,N'海淀',N'100014',8 union all
select 10,N'朝阳',N'100026',8
Go
--测试数据结束
;WITH cte AS (
SELECT id,areaname,iParent,
CAST(RIGHT('000' + CAST([Id] AS VARCHAR), 3) AS VARCHAR(MAX)) AS sort
FROM #T
WHERE iParent = 0
UNION ALL
SELECT #T.id,CONVERT(NVARCHAR(22),' '+#T.areaname),#T.iParent,
CAST(sort + RIGHT('000' + CAST(#T.[Id] AS VARCHAR),
3) AS VARCHAR(MAX))
FROM cte
INNER JOIN #T ON cte.Id = #T.iParent
)
SELECT cte.areaname FROM cte ORDER BY cte.sort
SELECT *
FROM
(SELECT *,CASE WHEN IPARENT=0 THEN THEN ID ELSE IPARENT END AS PARENT_ID,
CASE WHEN IPARENT=0 THEN 1 ELSE 2 END AS LEVEL
FROM TABLE) AS A
ORDER BY PARENT_ID,LEVEL,ID
USE tempdb
GO
IF OBJECT_ID('dbo.[t]') IS NOT NULL
DROP TABLE dbo.[t]
GO
CREATE TABLE dbo.[t](
[id] NVARCHAR(MAX)
,[areaname] NVARCHAR(MAX)
,[postcode] NVARCHAR(MAX)
,[iParent] NVARCHAR(MAX)
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[t] VALUES(N'1',N'浙江',NULL,N'0')
INSERT INTO dbo.[t] VALUES(N'2',N'杭州',N'315300',N'1')
INSERT INTO dbo.[t] VALUES(N'3',N'宁波',N'315400',N'1')
INSERT INTO dbo.[t] VALUES(N'4',N'温州',N'315500',N'1')
INSERT INTO dbo.[t] VALUES(N'5',N'上海',NULL,N'0')
INSERT INTO dbo.[t] VALUES(N'6',N'浦东',N'210013',N'5')
INSERT INTO dbo.[t] VALUES(N'7',N'张江',N'210023',N'5')
INSERT INTO dbo.[t] VALUES(N'8',N'北京',NULL,N'0')
INSERT INTO dbo.[t] VALUES(N'9',N'海淀',N'100014',N'8')
INSERT INTO dbo.[t] VALUES(N'10',N'朝阳',N'100026',N'8')
INSERT INTO dbo.[t] VALUES(N'11',N'西湖',N'315300',N'2')
GO
--增加一个排序函数
IF OBJECT_ID('[Fun_GetOrderBy]') IS NOT NULL DROP FUNCTION [Fun_GetOrderBy]
GO
CREATE FUNCTION [dbo].[Fun_GetOrderBy]
(
@id NVARCHAR(MAX)
)
RETURNS VARCHAR(500)
AS
BEGIN
DECLARE @r VARCHAR(500)
;with cte as
(
select id,iParent,id as orderBy from t where id=@id
union all
select a.id,a.iParent,a.id as orderBy from t A,
cte B where A.id=B.iParent
)
select @r=STUFF((SELECT '_'+RIGHT('0000'+ltrim(orderBy),4) from cte order BY RIGHT('0000'+ltrim(orderBy),4) ASC FOR XML PATH('')),1,1,'')
RETURN @r;
END
GO
--查询
SELECT
REPLICATE(' ',LEN(tt.orderBy)-4-charindex('-',reverse(tt.orderBy)))
+tt.areaname AS areaName
,tt.orderBy
FROM (
SELECT
t.areaname
,dbo.[Fun_GetOrderBy](id) AS orderBy
FROM t
) AS tt
ORDER BY tt.orderBy
SELECT *
FROM
(SELECT *,
CASE WHEN IPARENT=0 THEN ID ELSE IPARENT END AS PARENT_ID,
CASE WHEN IPARENT=0 THEN 1 ELSE 2 END AS LEVEL
FROM TABLE) AS A
ORDER BY PARENT_ID,LEVEL,ID
[/quote]
结果出来前,还是有这个错误
"SELECT 子句出错: “LEVEL”附近的表达式。
ORDER BY 子句出错。
无法分析查询文本。"
USE tempdb
GO
IF OBJECT_ID('dbo.[t]') IS NOT NULL
DROP TABLE dbo.[t]
GO
CREATE TABLE dbo.[t](
[id] NVARCHAR(MAX)
,[areaname] NVARCHAR(MAX)
,[postcode] NVARCHAR(MAX)
,[iParent] NVARCHAR(MAX)
)
GO
SET NOCOUNT ON
INSERT INTO dbo.[t] VALUES(N'1',N'浙江',NULL,N'0')
INSERT INTO dbo.[t] VALUES(N'2',N'杭州',N'315300',N'1')
INSERT INTO dbo.[t] VALUES(N'3',N'宁波',N'315400',N'1')
INSERT INTO dbo.[t] VALUES(N'4',N'温州',N'315500',N'1')
INSERT INTO dbo.[t] VALUES(N'5',N'上海',NULL,N'0')
INSERT INTO dbo.[t] VALUES(N'6',N'浦东',N'210013',N'5')
INSERT INTO dbo.[t] VALUES(N'7',N'张江',N'210023',N'5')
INSERT INTO dbo.[t] VALUES(N'8',N'北京',NULL,N'0')
INSERT INTO dbo.[t] VALUES(N'9',N'海淀',N'100014',N'8')
INSERT INTO dbo.[t] VALUES(N'10',N'朝阳',N'100026',N'8')
INSERT INTO dbo.[t] VALUES(N'11',N'西湖',N'315300',N'2')
GO
--增加一个排序函数
IF OBJECT_ID('[Fun_GetOrderBy]') IS NOT NULL DROP FUNCTION [Fun_GetOrderBy]
GO
CREATE FUNCTION [dbo].[Fun_GetOrderBy]
(
@id NVARCHAR(MAX)
)
RETURNS VARCHAR(500)
AS
BEGIN
DECLARE @r VARCHAR(500)
;with cte as
(
select id,iParent,id as orderBy from t where id=@id
union all
select a.id,a.iParent,a.id as orderBy from t A,
cte B where A.id=B.iParent
)
select @r=STUFF((SELECT '_'+RIGHT('0000'+ltrim(orderBy),4) from cte order BY RIGHT('0000'+ltrim(orderBy),4) ASC FOR XML PATH('')),1,1,'')
RETURN @r;
END
GO
--查询
SELECT *,dbo.[Fun_GetOrderBy](id) AS orderBy
FROM t
ORDER BY dbo.[Fun_GetOrderBy](id)
SELECT *
FROM
(SELECT *,
CASE WHEN IPARENT=0 THEN ID ELSE IPARENT END AS PARENT_ID,
CASE WHEN IPARENT=0 THEN 1 ELSE 2 END AS LEVEL
FROM TABLE) AS A
ORDER BY PARENT_ID,LEVEL,ID