有一个树状结构,层数不限,
这是一个简单的例子。
+----+------+
| Id | Pid  |
+----+------+
|  1 |    0 |
|  2 |    1 |
|  3 |    1 |
|  4 |    2 |
|  5 |    2 |
+----+------+
表中的Id是主键,Pid表明该项的父结点,其中0说明是根。
任意给出一个节点,需要返回其所有叶子节点。
比如:
给出1,返回345;
给出2,返回45。应该用什么样的SQL语句实现这样的查询呢?
谢谢:)

解决方案 »

  1.   

    据我所知,除了ORACLE有相应的SQL语句之外,
    其他数据库都得编程,
    因为这不是SQL ANSI标准语句
      

  2.   

    SQLServer全完可以实现.
    --测试数据
    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