1. 程式人生 > >SQL向下遞迴&向上遞迴 (無限級父子查詢)

SQL向下遞迴&向上遞迴 (無限級父子查詢)

id name pid
1 1 0
2 2 0
3 3 1
4 4 1
5 5 2
6 6 4

SQL Server & SQLite:

  • UNION :對兩個結果集進行並集,並且去重,按預設規則進行排序。
  • UNION ALL:不去重,不排序。
    在 SQL Server中必須使用 UNION ALL!
WITH locs(id,pid,name)
AS
(
SELECT id,pid,name FROM test WHERE id=1
UNION ALL
SELECT A.id,A.pid,A.name FROM test A,locs B ON A.pid = B.id -- b.pid=a.id 向上遞迴 ) select [id],[name],[pid] from locs

MySQL

用函式 也可解決這種需求問題。

  • group_concat 不適用資料較多的時候。
  • 在配置檔案(my.ini) 中預設無該配置項 group_concat_max_len
  • 要徹底修改,需在MySQL配置檔案中加上group_concat_max_len=-1 (-1為最大值或填入你要的最大長度)
  • 並重啟MySQL服務,在客戶端查詢修改好的值 show variables like “group_concat_max_len”;
 CREATE FUNCTION `fcGetTreeList`(rid INT) 
 RETURNS varchar(1000) 
 BEGIN 
 DECLARE sTemp VARCHAR(1000); 
 DECLARE sTempChd VARCHAR(1000); 

 SET sTemp = '$'; 
 SET sTempChd =cast(rid as CHAR); 

 WHILE sTempChd is not null DO 
   SET sTemp = concat(sTemp,',',sTempChd); 
   SELECT group_concat(id) INTO sTempChd FROM
treeNodes where FIND_IN_SET(pid,sTempChd)>0;
END WHILE; RETURN sTemp; END -- 呼叫 SELECT * from test where FIND_IN_SET(id,fcGetTreeList(1));