国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

有關數據庫SQL遞歸查詢在不同數據庫中的實現方法

2020-07-25 12:50:18
字體:
來源:轉載
供稿:網友

本文給大家介紹有關數據庫SQL遞歸查詢在不同數據庫中的實現方法,具體內容請看下文。

比如表結構數據如下:

Table:Tree

ID Name ParentId

1 一級  0

2  二級  1

3  三級  2

4 四級  3

SQL SERVER 2005查詢方法:

//上查with tmpTreeas(  select * from Tree where Id=2  union all  select p.* from tmpTree inner join Tree p on p.Id=tmpTree.ParentId)select * from tmpTree //下查with tmpTreeas(  select * from Tree where Id=2  union all  select s.* from tmpTree inner join Tree s on s.ParentId=tmpTree.Id)select * from tmpTree

SQL SERVER 2008及以后版本,還可用如下方法:

增加一列TID,類型設為:hierarchyid(這個是CLR類型,表示層級),且取消ParentId字段,變成如下:(表名為:Tree2)

TId    Id    Name

0x      1     一級
0x58     2    二級
0x5B40   3   三級
0x5B5E   4   四級

查詢方法:

SELECT *,TId.GetLevel() as [level] FROM Tree2 --獲取所有層級DECLARE @ParentTree hierarchyidSELECT @ParentTree=TId FROM Tree2 WHERE Id=2SELECT *,TId.GetLevel()AS [level] FROM Tree2 WHERE TId.IsDescendantOf(@ParentTree)=1 --獲取指定的節點所有下級DECLARE @ChildTree hierarchyidSELECT @ChildTree=TId FROM Tree2 WHERE Id=3SELECT *,TId.GetLevel()AS [level] FROM Tree2 WHERE @ChildTree.IsDescendantOf(TId)=1 --獲取指定的節點所有上級

ORACLE中的查詢方法:

SELECT *FROM TreeSTART WITH Id=2CONNECT BY PRIOR ID=ParentId --下查SELECT *FROM TreeSTART WITH Id=2CONNECT BY ID= PRIOR ParentId --上查

MYSQL 中的查詢方法:

//定義一個依據ID查詢所有父ID為這個指定的ID的字符串列表,以逗號分隔CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(rootId int,direction int) RETURNS varchar(1000) CHARSET utf8BEGIN DECLARE sTemp VARCHAR(5000);  DECLARE sTempChd VARCHAR(1000);  SET sTemp = '$';  IF direction=1 THEN   SET sTempChd =cast(rootId as CHAR);  ELSEIF direction=2 THEN   SELECT cast(ParentId as CHAR) into sTempChd FROM Tree WHERE Id=rootId;  END IF;  WHILE sTempChd is not null DO    SET sTemp = concat(sTemp,',',sTempChd);    SELECT group_concat(id) INTO sTempChd FROM Tree where (direction=1 and FIND_IN_SET(ParentId,sTempChd)>0)    or (direction=2 and FIND_IN_SET(Id,sTempChd)>0);  END WHILE;RETURN sTemp;END//查詢方法:select * from tree where find_in_set(id,getChildLst(1,1));--下查select * from tree where find_in_set(id,getChildLst(1,2));--上查

補充說明:上面這個方法在下查是沒有問題,但在上查時會出現問題,原因在于我的邏輯寫錯了,存在死循環,現已修正,新的方法如下:

CREATE DEFINER=`root`@`localhost` FUNCTION `getChildLst`(rootId int,direction int) RETURNS varchar(1000) CHARSET utf8BEGIN DECLARE sTemp VARCHAR(5000);  DECLARE sTempChd VARCHAR(1000);  SET sTemp = '$';  SET sTempChd =cast(rootId as CHAR);    IF direction=1 THEN  WHILE sTempChd is not null DO    SET sTemp = concat(sTemp,',',sTempChd);    SELECT group_concat(id) INTO sTempChd FROM Tree where FIND_IN_SET(ParentId,sTempChd)>0;  END WHILE;  ELSEIF direction=2 THEN  WHILE sTempChd is not null DO    SET sTemp = concat(sTemp,',',sTempChd);    SELECT group_concat(ParentId) INTO sTempChd FROM Tree where FIND_IN_SET(Id,sTempChd)>0;  END WHILE;  END IF;RETURN sTemp;END

這樣遞歸查詢就很方便了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 灌南县| 莒南县| 枣强县| 建瓯市| 射阳县| 翁源县| 巴里| 株洲市| 莎车县| 安西县| 乐山市| 杨浦区| 汝阳县| 海盐县| 曲沃县| 黎平县| 沙河市| 平舆县| 太谷县| 株洲县| 永川市| 中卫市| 安远县| 岳池县| 宝丰县| 阜南县| 临泉县| 兰西县| 来安县| 洮南市| 娄烦县| 玉树县| 永善县| 建始县| 磐石市| 西昌市| 桃园县| 抚宁县| 扎赉特旗| 钟祥市| 浦县|