给梦一个奔跑的方向!
PDF Print E-mail
User Rating: / 2
PoorBest 
Written by xlingfairy
Friday, 21 May 2010 11:39
经典的树表设计大概是这样:
 
ID, Name, ParentID
 
都在一个表里.
要取出这棵树,无非就是用存储过程,或在程序里递归.
一般推荐用存储过程来做,因为要是放在程序里用递归,要查询很多次的,没有一点效率.
 
 
前几天研究了用 WITH 实现递归, 今天我在写个用 WITH 读取一棵树的方法.
先看效果:
 
结果:
Electronics
---Home Audio Systems
------Micro Systems
------Mini Systems
------Amplifiers & Receivers
------Speakers
------Home Theaters
---MP3 Players
---Multimedia Players
---DVD Players & Recorders
------Digital Voice Recorders 
------DVD Recorders
------Portable DVD Players
------DVD & VCR Combo Players
------Set Top Boxes
------DVD players
---Projectors
---Unclassified
---GPS
---Portable Audio
------Cassette Players
------CD Players
------Portable CD Players
------Headphones
------Clock Radios
------Portable Radios
------Earphones
---Electronics Accessories
------Home Theater Systems Accessories
------Headphones Accessories
------Earphones Accessories
------Car Audio Accessories
------MP3 Players Accessories
---------Cases
---------Docking Stations
---------FM Transmitters
---------MP3 Headphones
---------MP3 Remote Controls
---------Speaker Systems
------DVD Players Accessories
------Speakers Accessories
------Projectors Accessories
------Scanners Accessories
------GPS Accessories
Music
---Alternative Rock
---Blues
---Children's Music
---Gospel
---Classical
...
...
...
 
看语句:
 
WITH CatTree AS (
SELECT
CategoryID, CategoryName, ParentID,
0 AS L,
CAST(ParentID AS VARCHAR) + ',' + CAST(CategoryID AS VARCHAR) AS Tag
FROM
CSK_Store_Category
WHERE
ParentID = 0
UNION ALL
SELECT
C.CategoryID, C.CategoryName, C.ParentID,
CatTree.L + 1 AS L,
CAST(CatTree.Tag AS VARCHAR) + ',' + CAST( C.CategoryID AS VARCHAR) AS Tag
FROM
CSK_Store_Category C INNER JOIN
CatTree ON C.ParentID = CatTree.CategoryID
)
SELECT 
*,
REPLACE(RIGHT(POWER(10, CatTree.L),CatTree.L),'0','---') + CategoryName 
FROM 
CatTree ORDER BY Tag
 
 
SQLServer 里没有诸如 LPAD, RPAD 这样的函数, 重复一个字符串还有点小技巧:
 
REPLACE(RIGHT(POWER(10, CatTree.L),CatTree.L),'0','---') + CategoryName
 
另外,让我不解的是我把上面代码里的 连接符号(,) 换成 (-) , 读出来的顺序居然错的离谱,如图:
 

Add comment


Security code
Refresh

Popular Contents

Recommend

Related Articles

Site Info

Members : 1
Content : 140
Web Links : 7
Content View Hits : 111327

Links