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));