SQL_存储过程CET递归查询获得树的叶子节点


USE [SooilSemanticsDB]
GO
/****** Object:  StoredProcedure [dbo].[usp_Semantics_GetLeaf]    Script Date: 2015/6/24 17:37:57 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[usp_Semantics_GetLeaf]
(
	@Parent nvarchar(255),
	@SR varchar(20)
)
as
begin
	with Childs(ConceptClassId,GlossaryId)
	as 
	(
		select s.CC2,s.T2
		from [dbo].[Semantics] s
			inner join [dbo].[CCTerm] cc on s.CC1 = cc.[ConceptClassId] and s.T1 = cc.[GlossaryId]
			inner join [dbo].[Glossary] g on s.T1 = g.Id
		where g.Term = @Parent
		  and s.SR = @SR

		union all

		select s.CC2,s.T2
		from Childs c
			inner join [dbo].[Semantics] s on c.ConceptClassId = s.CC1 and c.GlossaryId = s.T1
		where s.SR = @SR
		
	)

	select class.Tag
		  ,class.[Type]
		  ,g.Term
	from Childs child
		inner join [dbo].[ConceptClass] class on child.ConceptClassId = class.Id
		inner join [dbo].[Glossary] g on child.GlossaryId = g.Id
		left join [dbo].[Semantics] s on child.ConceptClassId = s.CC1 and child.GlossaryId = s.T1 and s.SR = @SR
	where s.T1 is null

	--select class.Tag
	--	  ,class.[Type]
	--	  ,g2.Term
	--from [dbo].[Semantics] s1
	--	inner join [dbo].[CCTerm] cc1 on s1.CC1 = cc1.[ConceptClassId] and s1.T1 = cc1.[GlossaryId]
	--	inner join [dbo].[Glossary] g1 on s1.T1 = g1.Id
	--	inner join [dbo].[CCTerm] cc2 on s1.CC2 = cc2.[ConceptClassId] and s1.T2 = cc2.[GlossaryId]
	--	inner join [dbo].[Glossary] g2 on s1.T2 = g2.Id
	--	inner join [dbo].[ConceptClass] class on s1.CC2 = class.Id
	--	left join [dbo].[Semantics] s2 on s1.CC2 = s2.CC1 and s1.T2=s2.T1 and s1.SR = s2.SR
	--where g1.Term = @Parent
	--  and s1.SR = @SR
	--  and s2.T1 is not null
end

SQL CET 递归查询

简单示例

create table Tree  
(  
  ID int identity(1,1) primary key not null,  
  Name varchar(20) not null,  
  Parent varchar(20) null  
)  
go  
insert Tree values('大学',null)  
insert Tree values('学院','大学')  
insert Tree values('计算机学院','学院')  
insert Tree values('网络工程','计算机学院')  
insert Tree values('信息管理','计算机学院')  
insert Tree values('电信学院','学院')  
insert Tree values('教务处','大学')  
insert Tree values('材料科','教务处')  
insert Tree values('招生办','大学')  
go  
with CTE as  
(  
-->Begin 一个定位点成员  
 select ID, Name,Parent,cast(Name as nvarchar(max)) as TE,0 as Levle from Tree where Parent is null  
-->End   
union all  
-->Begin一个递归成员  
 select Tree.ID, Tree.Name,Tree.Parent,cast(replicate(' ',len(CTE.TE))+'|_'+Tree.name as nvarchar(MAX)) as TE,Levle+1 as Levle  
        from Tree inner join CTE  
        on Tree.Parent=CTE.Name  
-->End  
)  
select * from CTE order by ID  

  1. --1.将 CTE 表达式拆分为定位点成员和递归成员。  
  2. --2.运行定位点成员,创建第一个调用或基准结果集 (T0)。  
  3. --3.运行递归成员,将 Ti 作为输入(这里只有一条记录),将 Ti+1 作为输出。  
  4. --4.重复步骤 3,直到返回空集。  
  5. --5.返回结果集。这是对 T0 到 Tn 执行 UNION ALL 的结果。

另一种修改后的查询方法

with CTE as    
(     
-->Begin 一个定位点成员     
 select ID, Name,Parent,cast(Name as nvarchar(max)) as TE,  
        ROW_NUMBER()over(order by getdate()) as OrderID  
        --最关键是上面这个字段,要获取排序字段,按字符串来排序。  
        --其中窗口函数必须要使用order by,但是不能用整型,那就用时间吧  
        from Tree where Parent is null    
-->End      
union all     
-->Begin一个递归成员     
 select Tree.ID, Tree.Name,Tree.Parent,cast(<span style="color:#ff0000;">replicate</span>(' ',len(CTE.TE))+'|_'+Tree.name as nvarchar(MAX)) as TE,  
        CTE.OrderID*100+ROW_NUMBER()over(Order by GETDATE()) as OrderID  
        from Tree inner join CTE     
        on Tree.Parent=CTE.Name     
-->End  <span style="color:#ff0000;"><span style="font-family: Arial, Helvetica, sans-serif;">replicate  </span><span style="font-family: Arial; font-size: 13px; line-height: 20px;">将字串值重复指定的次数</span>  </span>
)     
select * from CTE  
order by LTRIM(OrderID)--最后将这个整型数据转换为字符串型的进行排序  

  1. --有时候整型可以比大小,字符串也可以,字符串比的大小是一位一位进行字符比较的  
  2. --整型+字符串==整型,只有字符串+字符串==两个字符串的并和  
  3. --递归查询中:第二条记录可以引用第一条记录的值  
  4. --动态加载记录时,同一个等级的记录识别符:RowNumber()over(order by getdate())  
  5. --延伸:可以动态获取某个部门下的所以子部门。也可以获取该部门上级的所以部门  
  6.   
  7. --总结:首先要拼凑出一个整型数据,然后转换为字符串,最后是进行字符串的order,而不是整型数据的order,
注解:

CAST 和 CONVERT
将某种数据类型的表达式显式转换为另一种数据类型。CAST 和 CONVERT 提供相似的功能。
 
语法
使用 CAST:
 
CAST ( expression AS data_type ) 
 
使用 CONVERT:
 
CONVERT (data_type[(length)], expression [, style])
 
参数
expression
 
是任何有效的 Microsoft® SQL Server™ 表达式。有关更多信息,请参见表达式。 
 
data_type
 
目标系统所提供的数据类型,包括 bigint 和 sql_variant。不能使用用户定义的数据类型。有关可用的数据类型的更多信息,请参见数据类型。 
 
length
 
nchar、nvarchar、char、varchar、binary 或 varbinary 数据类型的可选参数。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用MyBatis的递归查询实现形结构的查询。具体步骤如下: 1. 定义实体类 定义一个实体类,表示的节点,包含节点id、父节点id、节点名称等属性。 2. 定义Mapper接口 定义一个Mapper接口,包含一个方法,用于查询形结构的节点。方法的返回值为List集合,表示查询到的形结构的节点。 3. 编写Mapper.xml配置文件 在Mapper.xml配置文件中,编写递归查询语句,通过查询语句实现形结构的查询。具体实现方式如下: - 定义一个select语句,用于查询指定节点的所有子节点。 - 在select语句中,使用union all关键字连接多个子查询语句,实现递归查询。 - 在子查询语句中,使用with recursive关键字定义递归查询语句。 4. 调用Mapper接口 在Java代码中,调用Mapper接口的方法,获取查询到的形结构的节点。可以通过递归遍历节点,实现形结构的展示。 下面是一个示例代码,供参考: ``` // 定义实体类 public class TreeNode { private Integer id; private Integer parentId; private String name; // getter和setter方法 } // 定义Mapper接口 public interface TreeNodeMapper { List<TreeNode> selectTreeNodes(Integer parentId); } // 编写Mapper.xml配置文件 <select id="selectTreeNodes" parameterType="java.lang.Integer" resultType="TreeNode"> with recursive cte(id, parent_id, name) as ( select id, parent_id, name from tree_node where parent_id = #{parentId} union all select tn.id, tn.parent_id, tn.name from tree_node tn inner join cte on tn.parent_id = cte.id ) select * from cte; </select> // 调用Mapper接口 @Autowired private TreeNodeMapper treeNodeMapper; public List<TreeNode> getTreeNodes(Integer parentId) { return treeNodeMapper.selectTreeNodes(parentId); } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值