最近项目中遇到了关于处理单表中父子级关系的的问题,以其中一个需求为列:先看一下主表结构:
现在的需求是给一个61可以查到61及61以下的所有子孙节点并返回为逗号隔开的字符串:如
博主的做法如下:
id | pid |
61 | 0 |
69 | 61 |
72 | 69 |
61,69,72 |
WITH tmp AS (
SELECT
*
FROM
主表
WHERE
parentid =
61
UNION ALL
SELECT
主表.*
FROM
tmp
JOIN 主表 ON tmp.id =
主表.parentid
)
SELECT '61,'+STUFF((SELECT ','+CAST(id AS VARCHAR(10)) FROM tmp for xml path('')),1,1,'')
(注:“主表”是博主项目中的表)
介绍:with as 用于声明临时表,可以理解为java中的全局变量,在复杂的查询中非常有用;
cast(字段名 as 类型名) 函数可以对字段进行强制类型转换;
for xml path()本来用于将查询结果以xml格式展示,但更常用于字符串的拼接,例如:
SELECT ','+CAST(id AS VARCHAR(10)) FROM tmp for xml path('')
,61,69,72 |
stuff函数主要用来删除字符串中某一部分:
STUFF ( character_1 , start , length ,character_2 ) 作用:将character_1中自start(SQL中都是从1开始,而非0)起,删除length个长度的字符,然后用character_2替换删掉的字符。本列中用于删除第一个多余的逗号。
希望对你有帮助谢谢!