打印

[数据库] 存储过程实现整理层次

一张数据表,内容结构如下:
表A:
levels       FInterID       FName       FItemID       FParentID       id
       1149       BOM7       1722       0       1
       1149       FName       1719       1722       2
       1149       FName       1697       1722       3
       1149       FName       1701       1722       4
       1149       FName       1704       1722       5
       1149       FName       1700       1722       6
       1149       FName       1713       1722       7
       1149       FName       1712       1722       8
       1149       FName       1699       1722       9
       1146       FName       1720       1719       10
       1146       FName       1721       1719       11
       1146       FName       1700       1719       12
       1148       FName       1709       1721       13
       1147       FName       1708       1720       14
       1147       FName       1723       1720       15
同一张表,经过处理后得到:
表B:
levels       FInterID       FName       FItemID       FParentID       id
       1149       BOM7       1722       0       1
.1       1149       FName       1719       1722       2
.1       1149       FName       1697       1722       3
.1       1149       FName       1701       1722       4
.1       1149       FName       1704       1722       5
.1       1149       FName       1700       1722       6
.1       1149       FName       1713       1722       7
.1       1149       FName       1712       1722       8
.1       1149       FName       1699       1722       9
..2       1146       FName       1720       1719       10
..2       1146       FName       1721       1719       11
..2       1146       FName       1700       1719       12
…3       1148       FName       1709       1721       13
…3       1147       FName       1708       1720       14
…3       1147       FName       1723       1720       15

问题是如何写一存储过程来实现填充levels列?
应当是用递推算法,但在存储过程中没弄过,求人指点下。
不必要给全代码,我也不是求全代码的,思路就OK
我命由我不由天~
80社区
不会写SQLServer 的存储过程,
按照你的意思,我用MYSQL的语法写了一个。没有测试(没有结构,没有数据)。
大概意思就是这样:递归。
复制内容到剪贴板
代码:
DELIMITER //
CREATE PROCEDURE TEST(IN IN_FItemID INT,IN IN_LEVELS INT)
BEGIN
  DECLARE V_CURRID INT;
  DECLARE V_STOP BOOL DEFAULT FALSE;
  DECLARE CUR1 CURSOR FOR SELECT FItemID FROM TABLE_A WHERE FParentID = IN_FItemID;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET V_STOP = TRUE;
  SET @@max_sp_recursion_depth = 200;
  OPEN CUR1;
  LAB1:WHILE NOT V_STOP DO
    FETCH CUR1 INTO V_CURRID;
    IF NOT V_STOP THEN
      UPDATE TABLE_A SET LEVELS = IN_LEVELS + 1 WHERE FItemID = V_CURRID;
      CALL TEST(V_CURRID,IN_LEVELS + 1);
    END IF;
  END WHILE LAB1;
  CLOSE CUR1;
END//
DELIMITER ;
[ 本帖最后由 xling 于 2008-8-12 11:41 编辑 ]
我向往我美丽的梦,但是美丽的太遥远。。。
求职,有意者请联系。。。
那个 levels 是写的 int 类型。
你在处理的时候,可以根据这个值生成 前缀点。
我向往我美丽的梦,但是美丽的太遥远。。。
求职,有意者请联系。。。
谢谢,俺整理成SQL的试试
我命由我不由天~
80社区

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!