有一个树状结构,层数不限,
这是一个简单的例子。
+----+------+
| Id | Pid |
+----+------+
| 1 | 0 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
+----+------+
表中的Id是主键,Pid表明该项的父结点,其中0说明是根。
任意给出一个节点,需要返回其所有叶子节点。
比如:
给出1,返回345;
给出2,返回45。应该用什么样的SQL语句实现这样的查询呢?
谢谢:)
这是一个简单的例子。
+----+------+
| Id | Pid |
+----+------+
| 1 | 0 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
+----+------+
表中的Id是主键,Pid表明该项的父结点,其中0说明是根。
任意给出一个节点,需要返回其所有叶子节点。
比如:
给出1,返回345;
给出2,返回45。应该用什么样的SQL语句实现这样的查询呢?
谢谢:)
其他数据库都得编程,
因为这不是SQL ANSI标准语句
--测试数据
CREATE TABLE tb(ID char(3),PID char(3),Name nvarchar(10))
INSERT tb 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','小分市'
GO--查询指定节点及其所有子节点的函数
CREATE FUNCTION [dbo].[f_Cid](@ID char(3))
RETURNS INT
AS
BEGIN
DECLARE @TOTAL INT
DECLARE @Level INT
DECLARE @t_Level TABLE(ID char(3),Level int)
SET @Level=1
SET @TOTAL=0
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM tb a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
SELECT @TOTAL=COUNT(*) FROM @t_LEVEL
RETURN @TOTAL
END--结果
SELECT Id,Total=dbo.f_Cid(Id)
FROM tb