日期:2014-05-19  浏览次数:20405 次

一个查询
表zone:
id           name             pid
1           黑龙江省         0
2           辽宁省             0
4           哈尔滨             1
5           北京                 0
6           沈阳                 2
7           长沙                 8
8           湖南                 0

这是一个省市表,pid字段记录市的上级省
我想通过一个查询把他们关联起来就像下面这样:
黑龙江省
    哈尔滨
辽宁省
    沈阳
湖南
    长沙
北京      

如何查询?

------解决方案--------------------
似乎要用递归吧...
------解决方案--------------------
--建立測試環境
Create Table zone
(id Int,
name Nvarchar(10),
pid Int)
--插入數據
Insert zone Select 1, N '黑龙江省 ', 0
Union All Select 2, N '辽宁省 ', 0
Union All Select 4, N '哈尔滨 ', 1
Union All Select 5, N '北京 ', 0
Union All Select 6, N '沈阳 ', 2
Union All Select 7, N '长沙 ', 8
Union All Select 8, N '湖南 ', 0
GO
--建立存儲過程
Create Procedure SP_TEST
As
Begin
--深度排序显示处理
--生成每个节点的编码累计
Declare @Level Int
Set @Level=0

Select id, id As pid, @Level As Level, ', ' + Rtrim(id) As Sort Into #T
From zone
Where pid = 0

While @@ROWCOUNT> 0
Begin
Set @Level = @Level + 1
Insert #T Select A.id, B.pid, @Level, B.Sort+ ', ' + Rtrim(A.id)
From zone A, #T B
Where A.pid = B.id
And B.Level = @Level - 1
End

--显示结果
Select SPACE(B.Level *2) + Rtrim(A.Name) As Name
From zone A, #T B
Where A.id = B.id
Order By B.pid, B.Sort

--刪除臨時表
Drop Table #T
End
GO
--測試
EXEC SP_TEST
GO
--刪除測試環境
Drop Table zone
Drop Procedure SP_TEST
--結果
/*
Name
黑龙江省
哈尔滨
辽宁省
沈阳
北京
湖南
长沙
*/

------解决方案--------------------
鱼sql四星来了.学习了。
------解决方案--------------------
...

MySQL就沒辦法了,不會。 :)
------解决方案--------------------
MARK
------解决方案--------------------
我就用笨办法 。。。。用 嵌套循环也可以达到效果
------解决方案--------------------
建两张表呀
------解决方案--------------------
create database TestDataBase

Create Table zone
(id Int,
name Nvarchar(10),
pid Int)
--插入數據
Insert zone Select 1, N '黑龙江省 ', 0
Union All Select 2, N '辽宁省 ', 0
Union All Select 4, N '哈尔滨 ', 1
Union All Select 5, N '北京 ', 0
Union All Select 6, N '沈阳 ', 2
Union All Select 7, N '长沙 ', 8