以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询 举例说明: SqlServer2008版本的Sql如下: 比如一个表,有id和pId字段,id是主键,pid表示它的上级节点,表结构和数据: CREATE TABLE [aaa]( [id] [int] NULL, [pid] [int] NULL, [name] [nchar](10) ) GO INSERT INTO aaa VALUES(1,0,'a') INSERT INTO aaa VALUES(2,0,'b') INSERT INTO aaa VALUES(3,1,'c') INSERT INTO aaa VALUES(4,1,'d') INSERT INTO aaa VALUES(5,2,'e') INSERT INTO aaa VALUES(6,3,'f') INSERT INTO aaa VALUES(7,3,'g') INSERT INTO aaa VALUES(8,4,'h') GO
--下面的Sql是查询出1结点的所有子结点 with my1 as(select * from aaa where id = 1 union all select aaa.* from my1, aaa where my1.id = aaa.pid ) select * from my1 --结果包含1这条记录,如果不想包含,可以在最后加上:where id <> 1
--下面的Sql是查询出8结点的所有父结点 with my1 as(select * from aaa where id = 8 union all select aaa.* from my1, aaa where my1.pid = aaa.id ) select * from my1;
--下面是递归删除1结点和所有子结点的语句: with my1 as(select * from aaa where id = 1 union all select aaa.* from my1, aaa where my1.id = aaa.pid ) delete from aaa where exists (select id from my1 where my1.id = aaa.id)
Oracle版本的Sql如下: 比如一个表,有id和pId字段,id是主键,pid表示它的上级节点,表结构和数据请参考SqlServer2005的,Sql如下: --下面的Sql是查询出1结点的所有子结点 SELECT * FROM aaa START WITH id = 1 CONNECT BY pid = PRIOR id
--下面的Sql是查询出8结点的所有父结点 SELECT * FROM aaa START WITH id = 8 CONNECT BY PRIOR pid = id
今天帮别人做了一个有点意思的sql,也是用递归实现,具体如下: 假设有个销售表如下: CREATE TABLE [tb]( [qj] [int] NULL, -- 月份,本测试假设从1月份开始,并且数据都是连续的月份,中间没有隔断 [je] [int] NULL, -- 本月销售实际金额 [rwe] [int] NULL, -- 本月销售任务额 [fld] [float] NULL -- 本月金额大于任务额时的返利点,返利额为je*fld ) ON [PRIMARY] 现在要求计算每个月的返利金额,规则如下: 1月份销售金额大于任务额 返利额=金额*返利点 2月份销售金额大于任务额 返利额=(金额-1月份返利额)*返利点 3月份销售金额大于任务额 返利额=(金额-1,2月份返利额)*返利点 以后月份依次类推,销售额小于任务额时,返利为0 具体的Sql如下: WITH my1 AS ( SELECT *, CASE WHEN je > rwe THEN (je * fld) ELSE 0 END fle, CAST(0 AS FLOAT) tmp FROM tb WHERE qj = 1 UNION ALL SELECT tb.*, CASE WHEN tb.je > tb.rwe THEN (tb.je - my1.fle -my1.tmp) * tb.fld ELSE 0 END fle, my1.fle + my1.tmp tmp -- 用于累加前面月份的返利 FROM my1, tb WHERE tb.qj = my1.qj + 1 ) SELECT * FROM my1
|
SQLserver2008使用表达式递归查询
--由父项递归下级
with cte(id,parentid,text)
as
(--父项
select id,parentid,text from treeview where parentid = 450
union all
--递归结果集中的下级
select t.id,t.parentid,t.text from treeview as t
inner join cte as c on t.parentid = c.id
)
select id,parentid,text from cte
---------------------------------------------------------------------------------------------------------------------------------------------
--由子级递归父项
with cte(id,parentid,text)
as
(--下级父项
select id,parentid,text from treeview where id = 450
union all
--递归结果集中的父项
select t.id,t.parentid,t.text from treeview as t
inner join cte as c on t.id = c.parentid
)
select id,parentid,text from cte
分享到:
相关推荐
sql server 2008 递归查询所有上级或下级数据
sqlserver递归查询树结构的表的根结点子最里层的子结点
oracle 如何递归查询父子关系。经常用于构造树结构
oracle树状结构查询即层次递归查询,是sql语句经常用到的,在实际开发中组织结构实现及其层次化实现功能也是经常遇到的。这篇文章给大家介绍了Oracle递归树形结构查询功能,需要的朋友参考下
Oracle使用递归SQL展示一棵树
详细描述在sqlserver 2005 中通过使用CTE 实现递归的方法
递归查询菜单树,支持mysql,oracle,含表结构,递归查询菜单,支持mysql,oracle,含表结构递归查询菜单。
Oracle使用递归查询。查询树结构的sql。在Oracle中,递归查询要用到start with ……connect by prior……
本文实例讲述了sql server实现递归查询的方法示例。分享给大家供大家参考,具体如下: 有时候面对树结构的数据时需要进行递归查询,网上找了一番,参考了各位大神的文章,发现蛮简单的,当做个小笔记方便以后使用 sql ...
-- 用SQL Server显示树结构, 不用递归算法,不用游标,没有层次限制, 速度很快 -- 显示、打印用起来很方便的 -- select * from Dept -- select * from dbo.GetDeptTree('00000000-0000-0000-0000-000000000000') ...
☆ 获取数据库所有表名,表的...SqlServer2005和Oracle 两个版本以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询举例说明:SqlServer2005版本的Sql如下:比如一个表,有i
oracle递归查询的例子,一个从创建表到查询的完整的例子。oralce递归查询是一个很实用的语句,在sqlserver目前还没有,但是语法常常不容易被我们记住,所以本人总结了一下,写到文档里了。
下面小编就为大家带来一篇sqlserver实现树形结构递归查询(无限极分类)的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
本文通过实例给大家介绍了sql server递归子节点、父节点sql查询表结构的实例解析,非常不错,具有参考借鉴价值,需要的的朋友参考下
代码如下:–由父项递归下级 with cte(id,parentid,text) as (–父项 select id,parentid,text from treeview where parentid = 450 union all –递归结果集中的下级 select t.id,t.parentid,t.text from treeview as...
oracle递归查询
oracle 递归调用 地区 ,用到的方法是 SYS_CONNECT_BY_PATH,可以扩展层级 名称
-- 用SQL Server取得树节点路径, 不用递归算法,不用游标,没有层次限制, 速度很快 -- 显示、打印用起来很方便的 -- print dbo.GetDeptPath('5cb3c3ee-4b2b-4005-8037-bb3876663d2e','->') -- select * from Dept
递归式指代码片段调用自身的情况;危险之处在于:如果调用了自身一次,那么如何防止他反复地调用自身。也就是说提供递归检验来保证适当的时候可以跳出。 以阶层为例子说存储过程中递归的调用。 递归 CREATE PROC ...
insert into dbo.hierarchy values(1,0,'河南省') ,(2,1,