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

一个复杂的查询,数据有树的逻辑结构,SQL如何写?
有两个表Area,Device
Area
AreaId,   AreaParent,   AreaName
          1,                     0,   河南
        47,                     1,   平顶山
        52,                   47,   鲁山
        53,                   47,   叶县
        54,                   47,   舞钢
        55,                   47,   汝州
        56,                   47,   郏县
        57,                   47,   市区
        58,                   47,   宝丰
Area有AreaId字段,标示地点,AreaParent标示其所属区域,
AreaParent的值也属于Area.AreaId,除了最顶层为0

Device表中的AreaId表示设备所属区域
Device
AreaId,   DevId,   DevName
        57,         62,   移动大楼
        57,         63,   朱堂
        58,         64,   东建材
        58,         65,   老汽车站
        52,         67,   市规划局
        52,         68,   技术监督局

要实现的查询:
输入AreaId,输出4级位置标示
AreaId=58,输出:
河南,平顶山,市区,东建材
河南,平顶山,市区,老汽车站

AreaId=1,输出:
河南,平顶山,市区,移动大楼
河南,平顶山,市区,朱堂
河南,平顶山,宝丰,东建材
河南,平顶山,宝丰,老汽车站
河南,平顶山,鲁山,市规划局
河南,平顶山,鲁山,技术监督局

------解决方案--------------------
树形数据深度排序处理示例(模拟单编号法)邹建

--测试数据
DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
INSERT @t SELECT '001 ',NULL , '山东省 '
UNION ALL SELECT '002 ', '001 ', '烟台市 '
UNION ALL SELECT '004 ', '002 ', '招远市 '
UNION ALL SELECT '003 ', '001 ', '青岛市 '
UNION ALL SELECT '005 ',NULL , '四会市 '
UNION ALL SELECT '006 ', '005 ', '清远市 '
UNION ALL SELECT '007 ', '006 ', '小分市 '

--深度排序显示处理
--生成每个节点的编码累计(相同当单编号法的编码)
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 PID IS NULL
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.PID=b.ID
AND b.Level=@Level-1
END

--显示结果
SELECT a.*
FROM @t a,@t_Level b
WHERE a.ID=b.ID
ORDER BY b.Sort
/*--结果
ID PID Name
------ --------- ----------
001 NULL 山东省
002 001 烟台市
004 002 招远市
003 001 青岛市
005 NULL 四会市
006 005 清远市
007 006 小分市
--*/

------解决方案--------------------
我N年前的一个贴子,有兴趣可以去看一下,可以实现树型目录的大部份功能,两个自定义函数
http://topic.csdn.net/t/20030120/12/1375432.html

可以实现:
得到ID为X的所有下层类别