分享几个项目中需要运用的中等难度的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 )
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 )