以sqlserver处理父子级关系查询为列介绍with as、cast()、for xml path()、stuff()的使用

来源:互联网 发布:湖北广电网络客服电话 编辑:程序博客网 时间:2024/06/09 17:09
最近项目中遇到了关于处理单表中父子级关系的的问题,以其中一个需求为列:先看一下主表结构:idpid61069617269现在的需求是给一个61可以查到61及61以下的所有子孙节点并返回为逗号隔开的字符串:如61,69,72博主的做法如下:
WITH tmp AS (SELECT*FROM主表WHEREparentid =61UNION ALLSELECT主表.*FROMtmpJOIN 主表 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替换删掉的字符。
本列中用于删除第一个多余的逗号。

希望对你有帮助谢谢!


阅读全文
0 0
原创粉丝点击