遍历联合查询

本文介绍了SQLServer中union和union all的应用,以及递归查询(CTE)的使用方法,适用于区域查询和菜单级别的查询需求。同时提供了具体的SQL示例帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享几个项目中需要运用的中等难度的sql server语句函数


1.union和union all


 都用于合并sql结果集操作,不管sql语句是否相同,但是返回字段最好一样,若不一样,字段名称只会以第一个为准 


 简单语句联合查询:


 SELECT * from Rn_BusinessType where Id='addac159-079d-4cac-a9c7-678c5b01f86b'


 UNION all


 SELECT * from Rn_BusinessType where Id='733b5b2c-fd82-4a0f-8620-a47987a85aa1'


 注意:UNION all语句优于and 和 or和 in 语句


 在项目中使用的比较少,但是我们在进行递归查询时,通常都是和它就挂钩啦!
 
2.SQL With (递归CTE查询)
 
 递归查询用到的场景大多数在
  
 区域查询:比如我查询成都市时 得把成都市的父级也查询出来或则把成都市的子级都查询出来


 菜单级别查询:比如查询3级菜单时,得把1,2级菜单也加载出来或则把4,5级菜单加载出来


 。。。。。。。
 
 运用递归查询 通常要查询的表 都是数据结构父子级关系的




 列1:通过模糊查询出它的上级关系
 
   WITH cte AS
(
SELECT o.*
FROM Areas o WHERE F_FullName like '%金峰镇%' 


UNION ALL


SELECT o.*
FROM Areas o INNER JOIN cte AS c on c.F_ParentId=o.F_Id
)
SELECT DISTINCT * FROM cte  
 


我解释下:


Areas :表名


F_FullName ;表字段(区域名称)


F_ParentId:表字段(父类ID)


F_Id:表字段(主键ID)


其中语句: 


SELECT o.* FROM Areas o WHERE F_FullName like '%金峰镇%' 


是作为cte的数据源 


然后在对cte数据源做遍历 迭代联合查询


与下语句关联 把数据源数据的父类ID作为联合查询语句的ID进行比对查询


UNION ALL


SELECT o.* FROM Areas o INNER JOIN cte AS c on c.F_ParentId=o.F_Id


直到没有比对数据为止 然后


SELECT DISTINCT * FROM cte 


然后把所有匹配的数据加载出来




列2:通过模糊查询出它的下级关系
 
   WITH cte AS
(
SELECT o.*
FROM Areas o WHERE F_FullName like '%金峰镇%' 


UNION ALL


SELECT o.*
FROM Areas o INNER JOIN cte AS c on c.F_Id=o.F_ParentId
)
SELECT DISTINCT * FROM cte  










列3:如果对某一级做级别改变时 ,它底下的子级级别是不是也要发生改变
 
 语句:F_Layers:表字段(级别值)


WITH cte AS
(
SELECT o.*
FROM Areas o WHERE F_Id=#{fId,jdbcType=VARCHAR} AND ISNULL(
F_DeleteMark, 0) != 1


UNION ALL


SELECT o.*
FROM Areas o INNER JOIN cte AS c on c.F_Id=o.F_ParentId
)
update Areas set F_Layers=F_Layers+1(级别转换值) WHERE F_Id in (
SELECT DISTINCT F_Id FROM cte )





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ctrl+C+V程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值