比如:id name parentid brotherid level
1 广东省 0 1 1
2 广州市 1 1 2
3 越秀区 2 1 3
4 应元路 3 1 4
5 天河区 2 2 3
6 深圳市 1 2 2
7 福田区 6 1 3
8 罗湖区 6 2 3
9 珠海市 1 3 2
10 新地区 2 3 3
11 新的地区 2 4 3我想要先按parentid再同一级别按brotherid排,效果如下:
1 广东省 0 1
2 广州市 1 1
3 越秀区 2 1
4 应元路 3 1
5 天河区 2 2
10 新地区 2 3
11 新的地区 2 4
9 珠海市 1 3
6 深圳市 1 2
7 福田区 6 1
8 罗湖区 6 2就像树的节点一样,依次排下下去。。请问改怎么写??
1 广东省 0 1 1
2 广州市 1 1 2
3 越秀区 2 1 3
4 应元路 3 1 4
5 天河区 2 2 3
6 深圳市 1 2 2
7 福田区 6 1 3
8 罗湖区 6 2 3
9 珠海市 1 3 2
10 新地区 2 3 3
11 新的地区 2 4 3我想要先按parentid再同一级别按brotherid排,效果如下:
1 广东省 0 1
2 广州市 1 1
3 越秀区 2 1
4 应元路 3 1
5 天河区 2 2
10 新地区 2 3
11 新的地区 2 4
9 珠海市 1 3
6 深圳市 1 2
7 福田区 6 1
8 罗湖区 6 2就像树的节点一样,依次排下下去。。请问改怎么写??
http://blog.csdn.net/xys_777/archive/2010/06/15/5672481.aspx
-- Author : htl258(Tony)
-- Date : 2010-06-21 11:10:56
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Blog : http://blog.csdn.net/htl258
------------------------------------------------------------------------------------> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[name] [nvarchar](10),[parentid] [int],[brotherid] [int],[level] [int])
INSERT INTO [tb]
SELECT '1','广东省','0','1','1' UNION ALL
SELECT '2','广州市','1','1','2' UNION ALL
SELECT '3','越秀区','2','1','3' UNION ALL
SELECT '4','应元路','3','1','4' UNION ALL
SELECT '5','天河区','2','2','3' UNION ALL
SELECT '6','深圳市','1','2','2' UNION ALL
SELECT '7','福田区','6','1','3' UNION ALL
SELECT '8','罗湖区','6','2','3' UNION ALL
SELECT '9','珠海市','1','3','2' UNION ALL
SELECT '10','新地区','2','3','3' UNION ALL
SELECT '11','新的地区','2','4','3'--SELECT * FROM [tb]-->SQL查询如下:;WITH t AS
(
SELECT *,px=CAST(id AS VARBINARY) FROM tb WHERE parentid=0
UNION ALL
SELECT a.*,CAST(px+CAST(a.id AS VARBINARY) AS VARBINARY)
FROM tb a
JOIN t b
ON a.parentid=b.id
)
SELECT id,NAME,parentid,brotherid,LEVEL
FROM t
ORDER BY px
/*
id NAME parentid brotherid LEVEL
----------- ---------- ----------- ----------- -----------
1 广东省 0 1 1
2 广州市 1 1 2
3 越秀区 2 1 3
4 应元路 3 1 4
5 天河区 2 2 3
10 新地区 2 3 3
11 新的地区 2 4 3
6 深圳市 1 2 2
7 福田区 6 1 3
8 罗湖区 6 2 3
9 珠海市 1 3 2(11 行受影响)
*/
(
SELECT *,px=CAST(id AS VARBINARY),lvl=0 FROM tb WHERE parentid=0
UNION ALL
SELECT a.*,CAST(px+CAST(a.id AS VARBINARY) AS VARBINARY),lvl+1
FROM tb a
JOIN t b
ON a.parentid=b.id
)
SELECT REPLICATE('.',lvl)+LTRIM(id) ID,NAME,parentid,brotherid,LEVEL
FROM t
ORDER BY px
/*
ID NAME parentid brotherid LEVEL
---------- ---------- ----------- ----------- -----------
1 广东省 0 1 1
.2 广州市 1 1 2
..3 越秀区 2 1 3
...4 应元路 3 1 4
..5 天河区 2 2 3
..10 新地区 2 3 3
..11 新的地区 2 4 3
.6 深圳市 1 2 2
..7 福田区 6 1 3
..8 罗湖区 6 2 3
.9 珠海市 1 3 2(11 行受影响)
*/这样看比较清楚
use Tempdb
go
--> -->
if not object_id(N'T') is null
drop table T
Go
Create table T([id] int,[name] nvarchar(10),[parentid] int,[brotherid] int,[level] int)
Insert T
select 1,N'广东省',0,1,1 union all
select 2,N'广州市',1,1,2 union all
select 3,N'越秀区',2,1,3 union all
select 4,N'应元路',3,1,4 union all
select 5,N'天河区',2,2,3 union all
select 6,N'深圳市',1,2,2 union all
select 7,N'福田区',6,1,3 union all
select 8,N'罗湖区',6,2,3 union all
select 9,N'珠海市',1,3,2 union all
select 10,N'新地区',2,3,3 union all
select 11,N'新的地区',2,4,3
Go
DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,ID
FROM T
WHERE [parentid]=0
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
FROM T a,@t_Level b
WHERE a.[parentid]=b.ID
AND b.Level=@Level-1
ORDER BY ID
ENDSELECT a.*
FROM T a,@t_Level b
WHERE a.ID=b.ID
ORDER BY CAST(b.Sort AS INT)
id name parentid brotherid level
----------- ---------- ----------- ----------- -----------
1 广东省 0 1 1
2 广州市 1 1 2
3 越秀区 2 1 3
6 深圳市 1 2 2
5 天河区 2 2 3
9 珠海市 1 3 2
4 应元路 3 1 4
10 新地区 2 3 3
11 新的地区 2 4 3
7 福田区 6 1 3
8 罗湖区 6 2 3(11 個資料列受到影響)
;WITH t AS
(
SELECT *,px=CAST(id AS VARBINARY),lvl=0 FROM tb WHERE parentid=0
UNION ALL
SELECT a.*,CAST(px+CAST(a.id AS VARBINARY) AS VARBINARY),lvl+1
FROM tb a
JOIN t b
ON a.parentid=b.id
)
SELECT REPLICATE('.',lvl)+LTRIM(id) ID,NAME,parentid,brotherid,LEVEL
FROM t
ORDER BY px
/*
ID NAME parentid brotherid LEVEL
---------- ---------- ----------- ----------- -----------
1 广东省 0 1 1
.2 广州市 1 1 2
..3 越秀区 2 1 3
...4 应元路 3 1 4
..5 天河区 2 2 3
..10 新地区 2 3 3
..11 新的地区 2 4 3
.6 深圳市 1 2 2
..7 福田区 6 1 3
..8 罗湖区 6 2 3
.9 珠海市 1 3 2大家再帮我看看吧
-- Author : htl258(Tony)
-- Date : 2010-06-21 11:10:56
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)
-- Blog : http://blog.csdn.net/htl258
------------------------------------------------------------------------------------> 生成测试数据表: [tb]
IF OBJECT_ID('[tb]') IS NOT NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb] ([id] [int],[name] [nvarchar](10),[parentid] [int],[brotherid] [int],[level] [int])
INSERT INTO [tb]
SELECT '1','广东省','0','1','1' UNION ALL
SELECT '2','广州市','1','1','2' UNION ALL
SELECT '3','越秀区','2','1','3' UNION ALL
SELECT '4','应元路','3','1','4' UNION ALL
SELECT '5','天河区','2','2','3' UNION ALL
SELECT '6','深圳市','1','2','2' UNION ALL
SELECT '7','福田区','6','1','3' UNION ALL
SELECT '8','罗湖区','6','2','3' UNION ALL
SELECT '9','珠海市','1','3','2' UNION ALL
SELECT '10','新地区','2','3','3' UNION ALL
SELECT '11','新的地区','2','4','3'--SELECT * FROM [tb]
DECLARE @t_Level TABLE(ID char(3),Level int,Sort VARBINARY(8000))
DECLARE @Level int
SET @Level=0
INSERT @t_Level SELECT ID,@Level,cast(ID AS VARBINARY)
FROM Tb
WHERE [parentid]=0
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level,b.Sort+cast(a.ID AS VARBINARY)
FROM Tb a,@t_Level b
WHERE a.[parentid]=b.ID
AND b.Level=@Level-1
ORDER BY ID
ENDSELECT pxid=cast(replicate('.',b.Level)+LTRIM(a.id) AS VARCHAR),a.*
FROM Tb a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*
pxid id name parentid brotherid level
------------------------------ ----------- ---------- ----------- ----------- -----------
1 1 广东省 0 1 1
.2 2 广州市 1 1 2
..3 3 越秀区 2 1 3
...4 4 应元路 3 1 4
..5 5 天河区 2 2 3
..10 10 新地区 2 3 3
..11 11 新的地区 2 4 3
.6 6 深圳市 1 2 2
..7 7 福田区 6 1 3
..8 8 罗湖区 6 2 3
.9 9 珠海市 1 3 2(11 行受影响)
*/