日期:2014-05-18  浏览次数:20535 次

求一个多极菜单的sql语句.数据库设计
就是查询出一个父节点下面的所有子节点,和子节点下面的所有子节点。

------解决方案--------------------
BOM节点处理,写个2005的,其他方法可以查询的到的。

SQL code

--表tb 字段 id parentid

;with cte as
(
    select id,parentid from tb where id = 2  --查询2下所有节点信息
    union all
    select a.id,a.parentid
    from tb a join cte b on a.parentid = b.id
    where a.id is not null
)

select * from cte

------解决方案--------------------
SQL code

--测试数据

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 f_Cid(@ID char(3))

RETURNS @t_Level TABLE(ID char(3),Level int)

AS

BEGIN

    DECLARE @Level int

    SET @Level=1

    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

    RETURN

END

GO

 

--调用函数查询002及其所有子节点

SELECT a.*

FROM tb a,f_Cid('002') b

WHERE a.ID=b.ID

/*--结果

ID   PID  Name       

------ ------- ---------- 

002  001  烟台市

004  002  招远市

--*/

------解决方案--------------------
SQL code
select c.* from Comment c where c.articleId = 'bd3f3e72359c96e201359e85f0940001'
 union select a.* from Comment a inner loop join Comment b on a.commentId = b.id
 and b.articleId = 'bd3f3e72359c96e201359e85f0940001'