![]() |
购物专题 | 基金专题 | 性专题 | 饮食专题 | 教育专题 | 生活大参考 | 园林资讯 | 园艺库 | 健康专题 | |
| 论文专题 | 家庭养花 | 园林景观 | 盆景奇石 | 激情图库 | 农业资料库 | 园林古建 | 英文站 | 花卉栽培 |
其中表cm_dictionary 中有两个字段cd_id,cd_parentid,均为整形。现在目的是输入一个参数id,递归取出其所有的子ID集合,以逗 号分开,包括子ID的子ID。查询SQL语句为select cd_id from cm_dictionary where cd_parentid= @pid
用临时表比较好解决
---------------------------------------------------------------
--创建测试表
CREATE TABLE cm_dictionary(
CD_ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
CD_PARENTID INT NOT NULL DEFAULT 0
)
GO
--插入测试数据
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(0);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(1);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(2);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(1);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(1);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(2);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(2);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(3);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(3);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(4);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(5);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(9);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(10);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(11);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(10);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(10);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(8);
INSERT INTO cm_dictionary (CD_PARENTID) VALUES(7);
GO
--模拟存储过程
SET NOCOUNT ON
DECLARE @PID INT
SET @PID=2
DECLARE @TBL TABLE(
G INT NOT NULL,
D INT NOT NULL
)
DECLARE @TBL_TMP TABLE(
G INT NOT NULL,
D INT NOT NULL
)
DECLARE @TBL_SWAP TABLE(
G INT NOT NULL,
D INT NOT NULL
)
DECLARE @I INT
SET @I=0
--先取出当前级别的子节点
INSERT INTO @TBL_TMP SELECT 0 AS G,cd_id AS D FROM cm_dictionary WHERE cd_parentID=@PID
--如果临时的临时表有数据,就继续往下查询
WHILE EXISTS (SELECT * FROM @TBL_TMP)
BEGIN
--先复制到输出表
INSERT INTO @TBL SELECT * FROM @TBL_TMP
--把当前级的数据保存到@TBL_SWAP,然后清空当前临时表
DELETE FROM @TBL_SWAP
INSERT INTO @TBL_SWAP SELECT * FROM @TBL_TMP
DELETE FROM @TBL_TMP
SET @I=@I+1
INSERT INTO @TBL_TMP SELECT @I AS G,cd_id AS D FROM cm_dictionary WHERE cd_parentID IN (SELECT D FROM @TBL_SWAP)
END
--输出所有的子节点
SELECT G AS [级别],D AS [子节点编号] FROM @TBL
GO
--删除测试表
DROP
浙ICP备 :07003766号 Copyright © 2001-2007 JUBAO163,All rights reserved. |