Sql语句里的递归查询(转)

Sql语句里的递归查询(转)

原文摘自:http://blog.csdn.net/pdn2000/article/details/6674243

 

Sql语句里的递归查询 SqlServer2005和Oracle 两个版本

 

以前使用Oracle,觉得它的递归查询很好用,就研究了一下SqlServer,发现它也支持在Sql里递归查询
举例说明:
SqlServer2005版本的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

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109912.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pytest重试_pytest的conftest

    pytest重试_pytest的conftest安装:pip3installpytest-rerunfailures重新运行所有失败用例要重新运行所有测试失败的用例,请使用–reruns命令行选项,并指定要运行测试的最大次数:$py

    2022年7月30日
    8
  • java安装(找不到jre还苦恼的同志们)「建议收藏」

    java安装(找不到jre还苦恼的同志们)「建议收藏」玩java当然需要装java了,可是我的jre哪去了?懵逼的朋友请看下文。安装地址:(https://www.oracle.com/technetwork/java/javase/downloads/index.html)安装步骤:进入上面那个网址下载一个适合你操作系统的java,安装时,按照步骤一步一步向下走就OK了。(如果你下载的Java安装后,你能找到你的jre,就不要看下面的文章了,…

    2022年7月15日
    17
  • Mysql 分页查询limit 不能使用运算符[通俗易懂]

    mysqllimit不能使用运算符进行分页查询的时候,如果写成以下sql,语句执行会报错:select*fromuserwhereid=123456andcode=111andcreate_date>=20190101andcreate_date<=20190202limit(1-1)*1,20因为mysql中limit…

    2022年4月11日
    152
  • js保留两位小数的方法_jquery 保留两位小数

    js保留两位小数的方法_jquery 保留两位小数一、我们首先从经典的“四舍五入”算法讲起1、四舍五入的情况?12varnum=2.446242342;num=num.toFixed(2);//输出结果为2.452、不四舍五入第一种,先把小数边整数:?1Math.floor(15.7784514000*100)/100//输出结果为15.77第二种,当作字符串,使用正则匹配:?1Number(…

    2022年8月10日
    7
  • 到底学Python还是Java?一张图PK明白!

    到底学Python还是Java?一张图PK明白!点击上方“程序人生”,选择“置顶公众号”第一时间关注程序猿(媛)身边的故事Java和Python一直都是两种很火很强大的编程语言,对于刚开始起步学习编程的同学来说,会迷惑且最经常问的问题是,我该学Java还是Python,是不是Python容易学,或是应该先学什么编程语言等等这样的问题。作为一名Java程序员,肯定会建议你先学Java,然后再学Python,但如果你问一个

    2022年7月7日
    20
  • java fork join_java8学习:ForkJoin[通俗易懂]

    java fork join_java8学习:ForkJoin[通俗易懂]先实现一下,再来说原理还是实现1到一千万的累加和publicclassForkJoinImplextendsjava.util.concurrent.RecursiveTask{//临界值,就是结束值减开始值的结果如果小于这个值那么就不拆分了,大于这个值才会拆分privatefinalintMEDIAN_NUM=100000;//从多少计算privateintstart_n…

    2022年9月20日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号