遍历SnoMed的multiHierarchy中给定概念的子概念

-- create TABLE

DROP TABLE IF EXISTS `subTerms`;
CREATE TABLE `subTerms`(
`Id` INT(255) NOT NULL AUTO_INCREMENT,
`termConceptId` varchar(255) DEFAULT '0',
`terms` varchar (255) DEFAULT '0',
PRIMARY KEY (`Id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;

DROP TABLE IF EXISTS `targetConceptId`;
CREATE TABLE `targetConceptId`(
`ConceptId` varchar(255) DEFAULT '0',
PRIMARY KEY (`ConceptId`)
) ENGINE=INNODB DEFAULT CHARSET=UTF8;

=======================================

-- function: traverseOneLayer

-- hierarchy recursive search
DROP FUNCTION  IF EXISTS `traverseOneLayer`;
CREATE FUNCTION  `traverseOneLayer`(sTempChd TEXT ) -- 函数参数
RETURNS TEXT

BEGIN
      DECLARE sTemp VARCHAR(255);
        -- DECLARE sTempChd VARCHAR(4000);
        DECLARE cur_end INT DEFAULT 0;
        -- SELECT sourceId from relationship where FIND_IN_SET(destinationId,sTempChd)>0;
        DECLARE cur CURSOR FOR SELECT sourceId from relationship where FIND_IN_SET(destinationId,sTempChd)>0 and typeId='116680003';
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET cur_end = 1;  -- 游标的select语句无查询结果
        OPEN  cur; -- 打开游标
        --
        SET sTempChd='$';  -- 清空
    onelayerLoop:LOOP
            FETCH cur INTO sTemp; -- 把第一行数据(conceptId)写入变量中,游标也随之指向了记录的第一行

            IF cur_end= 1 THEN
                LEAVE onelayerLoop;      -- 游标循环结束,跳出
            END IF;

      IF not EXISTS(select * from targetConceptId WHERE conceptId=sTemp) THEN   -- 该节点存在表示
                INSERT INTO targetConceptId(ConceptId) VALUES(sTemp);
                INSERT INTO subterms(termConceptId, terms) select conceptId,term from description WHERE conceptId=sTemp;
                SET sTempChd=concat(sTempChd ,',',sTemp);  -- 某一层的子节点串入sTempChd,作为下一次输入
            END IF;    
         END LOOP;
         --
         CLOSE cur;  
 
RETURN sTempChd;
END

===================================================

-- procedure: querySubTerms

DROP PROCEDURE IF EXISTS `querySubTerms`;
CREATE PROCEDURE `querySubTerms`(startId VARCHAR(255)) -- 函数参数
-- ETURNS VARCHAR(4000)

BEGIN
      DECLARE i int;
    DECLARE sTempChd TEXT;
        SET sTempChd =startId;  -- cast(rootId as CHAR); 当前的节点        -- SET i=0;
        TRUNCATE TABLE subterms; -- 清空结果表
        TRUNCATE TABLE targetConceptId;
        INSERT INTO targetConceptId(ConceptId) VALUES(startId);
        INSERT INTO subterms(termConceptId, terms) select conceptId,term from description WHERE conceptId=startId;

    WHILE (sTempChd !='$')  Do  -- 某一层的遍历,sTempChd中是该层所有节点    
            SELECT traverseOneLayer(sTempChd) INTO sTempChd;    -- 调用函数,返回下一层的所有节点
        END WHILE;        
END

==================================

call querySubTerms(254837009);

原文地址:https://www.cnblogs.com/carol-wei/p/7623107.html