SQL向下遞迴&向上遞迴 (無限級父子查詢)
阿新 • • 發佈:2019-01-25
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));