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

Sql语句里的递归查询相关推荐

  1. SQL语句里将字符串转换数字类型

    SQL语句里将字符串转换数字类型 select * from internal_external_rating_info order by convert(int,internal_rating)   ...

  2. SQL语句里中括号的作用

    在写一些sql语句的时候会发现同一个语句里有的字段是直接写的,而有的是要用中括号括起来的,为什么要用中括号呢?这就需要了解一下中括号的作用: 1.为了防止某些关键字在使用中引起歧义,如果加上中括号,则 ...

  3. java sql 引号_java拼接sql语句里的单双引号

    一.场景描述 平时在用字符串拼接sql语句的时候,有没有遇到过下面的情况: 没错,就是单双引号问题.其实,关于双引号我们是容易理解的,sql语句是用String字符串拼接的,因此需要用到双引号.但是为 ...

  4. oracle中sql语句 日期加减,SQL语句里对日期进行相加减

    在sql server里可以使用: where start_date <= DateAdd(d,1,to_date('2005-12-09','yyyy-mm-dd')) and complet ...

  5. sql语句里的limit使用方法

    SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset 在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办 ...

  6. mysql on是什么意思_这SQL语句里的ON 是什么意思啊

    展开全部 on条件是在生成临时32313133353236313431303231363533e59b9ee7ad9431333433626439表时使用的条件,它不管on中的条件是否为真,都会返回左 ...

  7. SQL语句里||连接符的使用

    先赞后看,此生必赚! 一.|| 作用 ||表示拼接,如'a'||'b' 等价于'ab' 二.|| 举例: 批量生成select语句 select 'select * from ' || tname | ...

  8. mysql sql语句里连接符的使用_SQL中group_concat函数,用符号连接查询分组里字段值...

    MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔 ...

  9. mybatis中的xml配置文件中sql语句里的比较符号需要用特殊标签包裹有比较大于和小于条件

    因xml文件中的比较符合与标签符合一样,系统为区分比较符合就需要特殊标签包裹下: <select id="queryRefundTimeBorrowerInfo"result ...

最新文章

  1. MySQL5.7.10多元复制功能搭建
  2. 自己录制的Oracle 相关视频(陆续更新)
  3. Linux 设置 Swap 空间
  4. 通过java反射机制获取该类的所有属性类型、值。
  5. 金融资讯数据服务平台建设实践
  6. 178页,四年图神经网络研究精华,图卷积网络作者Thomas Kipf博士论文公布
  7. java项目收获总结_java开发项目收获心得
  8. 铃木敏文《零售的哲学》品读之对产品经理和程序员的现实意义 下篇
  9. 什么是机器翻译?(科普向)
  10. 安装和使用Entrez Direct
  11. [转]再分析资料整理
  12. 易宝支付[钱麦](附代码)
  13. 想学CNC编程的一定要看过来~
  14. 清华大学计算机系2015分数线,2015年清华大学录取分数线
  15. AirBnb 创业三剑客
  16. 电子漫画系列更新4张震撼美图,共计62张,迫不及待想分享给你们!
  17. QQ群630300475介绍
  18. 驱动人生,FUCK YOU,有没有底线呀
  19. Satpy基础系列教程(1)-FY4A AGRI L1数据处理
  20. 有一个企微运营机器人同事是一种什么体验?

热门文章

  1. QT的QHistoryState类的使用
  2. C++函数调用运算符重载
  3. c++STL(标准模板库)理论基础
  4. C++代码在Sublime Text 3中编译和运行
  5. 1.18.2.10 解释表:Table.explain、物理执行计划等
  6. nginx对https的配置,nginx解决post请求被请求两次的问题
  7. WebLogic重启
  8. 04_NoSQL数据库之Redis数据库:set类型和zset类型
  9. 数据库元数据数据字典查询_2_列出所有的数据库
  10. RASA NLU Chi安装