Sqlserver With用法

用法1:第一级数据统计

use Tempdb

go

if not object_id(N'Tempdb..#T') is null

    drop table #T

Go

Create table #T([ID] int,[Name] nvarchar(22),[Score] int,[ParentID] int)

Insert #T

select 1,N'战一',101,0 union all

select 2,N'战二',102,1 union all

select 3,N'战三',103,1 union all

select 4,N'战四',104,3 union all

select 6,N'战五',105,0 union all

select 7,N'战五',105,6

GO

;WITH CTET AS

(

Select *,ID2=ID,Name2=Name from #T WHERE ParentID=0

UNION ALL

SELECT a.*,b.ID2,b.Name2 FROM #T AS a INNER JOIN CTET AS b ON b.ID=a.ParentID

)

SELECT ID2,Name2,SUM(Score) AS Scroe,COUNT(*) AS con FROM CTET GROUP BY Name2,ID2

/* 

ID2    Name2    Scroe    con

1    战一    410    4

6    战五    210    2*/

用法二:统计每个数据

create table tbs(id varchar(3) , pid varchar(3) , name varchar(10));
insert into tbs values('001' , null , '广东省');
insert into tbs values('002' , '001' , '广州市'); 
insert into tbs values('003' , '001' , '深圳市') ;
insert into tbs values('004' , '002' , '天河区') ;
insert into tbs values('005' , '003' , '罗湖区');
insert into tbs values('006' , '003' , '福田区') ;
insert into tbs values('007' , '003' , '宝安区') ;
insert into tbs values('008' , '007' , '西乡镇') ;
insert into tbs values('009' , '007' , '龙华镇');
insert into tbs values('010' , '007' , '松岗镇');

select * from tbs

with t as (
    select id,id q from tbs union all
    select a.id,b.q from tbs a inner join t b on a.pid=b.id
)
select tbs.*,COUNT(1)-1 from t inner join tbs on t.q=tbs.id group by tbs.id,tbs.name,tbs.pid

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WITH RECURSIVE是SQL Server中递归查询的一种方式,也称为CTE递归查询。递归查询是指在一个表中对自身进行查询,直到查询结果满足条件为止。在SQL Server中使用WITH RECURSIVE可以实现递归查询。WITH RECURSIVE的语法如下: ``` WITH recursive_cte (col1, col2, col3, ...) AS ( --初始查询语句 SELECT col1, col2, col3, ... FROM table_name WHERE condition UNION ALL --递归查询语句 SELECT col1, col2, col3, ... FROM table_name JOIN recursive_cte ON recursive_cte.col = table_name.col WHERE condition ) SELECT * FROM recursive_cte; ``` 其中,recursive_cte是递归公共表达式的名称,col1、col2、col3是要查询的列,table_name是要查询的表名,condition是查询条件。在WITH RECURSIVE中,包含两个查询语句:初始查询语句和递归查询语句。初始查询语句用于筛选出符合条件的记录,递归查询语句用于在初始查询语句的基础上对自身进行递归查询。 需要注意的是,WITH RECURSIVE中的递归查询语句必须包含UNION ALL关键字,并且UNION ALL后面的SELECT语句必须引用了递归公共表达式recursive_cte。如果不包含UNION ALL或者引用了其他表,则会导致死循环。 以下是一个WITH RECURSIVE的例子: ``` WITH recursive_cte (employee_id, manager_id, level) AS ( -- 初始查询语句 SELECT employee_id, manager_id, 0 as level FROM employee_table WHERE employee_id = 1 UNION ALL -- 递归查询语句 SELECT employee_table.employee_id, employee_table.manager_id, recursive_cte.level + 1 FROM employee_table JOIN recursive_cte ON recursive_cte.manager_id = employee_table.employee_id ) SELECT * FROM recursive_cte; ``` 这个例子用于查询一个员工及其直接或间接的所有上级领导。在初始查询语句中,我们选择了员工ID为1的员工作为起点。在递归查询语句中,我们通过JOIN连接到employee_table表中,并使用recursive_cte中的level来计算每个员工的级别。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值