`

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

阅读更多

(抄自http://blog.csdn.net/pdn2000/article/details/6674243

以前使用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

分享到:
评论

相关推荐

    ORACLE和SQL Server的语法区别

    ### ORACLE和SQL Server的语法区别 #### 一、概述 本文主要介绍Oracle与SQL Server在SQL语言层面的异同之处,重点在于Transact-SQL(T-SQL)与PL/SQL之间的区别,并提供了一些迁移策略。对于希望将现有的Oracle...

    Oracle和SQL_Server的语法区别

    - 两个系统中,比较运算符可能有细微差别,例如 Oracle 使用 `BETWEEN`,而 SQL Server 同样支持。 5. **字符串串联运算符**: - Oracle 使用 `||` 进行字符串连接,而在 SQL Server 中应使用 `+`。 6. **PL/SQL...

    ORACLE与SQLSERVER语法差异分析

    在数据库管理领域,ORACLE和SQL SERVER是两个广泛使用的数据库管理系统,它们在语法上有许多相似之处,但也存在一些显著的差异。以下是对标题和描述中所述知识点的详细说明: 1. **递归查询**: - 在SQL SERVER中...

    sql_函数实现三种父子递归

    在SQL Server 2005及以上版本,还可以使用公用表表达式(CTE)进行递归查询,以更简洁的方式完成相同的功能。 2. 查找所有父节点(反向递归): 与查找子节点相反,我们从一个节点开始,向上查找其所有父节点直至根...

    数据库设计之递归树查询

    本文将深入探讨如何通过递归查询来解决这类问题,并着重讲解使用`WITH`语句来实现递归查询的方法,适用于多种数据库系统,如MySQL、PostgreSQL、SQL Server等。 一、理解递归查询 递归查询是一种在数据库中遍历层级...

    oracle递归查询的例子

    在数据库查询语言中,Oracle 提供了一种强大的功能——递归查询,这在其他数据库系统如 SQL Server 中是缺失的功能。递归查询允许用户执行多级关联查询,特别适用于处理具有层次结构的数据,例如组织结构图、文件...

    深入sql oracle递归查询

    这个问题需要根据连续月份的销售情况计算返利,Oracle和SQL Server都可以使用递归CTE来解决,但具体的SQL语句会因数据库系统而异。 总的来说,Oracle和SQL Server的递归查询功能虽然在语法上有所不同,但都能有效地...

    SQL 语句大全 SQL 语句大全

    - **联接查询**:JOIN操作将两个或更多表的数据结合在一起,如INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。 - **子查询**:在主查询内部嵌套的查询,可以用来比较、过滤或计算。 3. **DDL语句** - **创建表*...

    oracle和SQL的语法区别

    在 SELECT 语句方面,虽然基本结构相似,但 Oracle 的特定功能如 `START WITH` 和 `CONNECT BY` 用于构建层次查询,在 SQL Server 中可以通过递归查询或存储过程实现。此外,Oracle 的 `INTERSECT` 和 `MINUS` 集合...

    一种MySQL数据库SQL递归查询的研究与实现.pdf

    虽然MySQL在处理常规数据操作和查询方面表现出色,但在某些特定功能上,如递归查询,与Oracle和SQL Server等商业数据库相比,存在一定的局限性。在MySQL中,没有内置的递归查询语句,通常需要借助存储过程或存储函数...

    在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现.pdf

    ORACLE、MSSQL(Microsoft SQL Server)、MYSQL是三大主流数据库系统,它们各自提供了不同的方式来实现递归查询。 首先,我们来看ORACLE数据库中的递归查询。ORACLE通过CONNECT BY子句来实现递归查询。CONNECT BY...

    sql查询某个parentid下的所有childid

    它基于一个称为“连接路径”的概念,允许用户按照某种层次关系对表进行递归查询。主要用到的关键字有: - **PRIOR**:用于指定父行和子行之间的关系。 - **START WITH**:指定递归查询的起始行。 - **CONNECT BY**...

    Oracle.10G.SQL.Reference&SQL Server试题

    标题中的“Oracle.10G.SQL.Reference&SQL Server试题”表明了这个压缩包可能包含两部分主要内容:Oracle 10g的SQL参考指南和与SQL Server相关的试题集。Oracle 10g是Oracle数据库的一个旧版本,而SQL是用于管理和...

    ORACLE和SQL语法区别归纳

    Oracle数据库系统与SQL(结构化查询语言)是两个在数据库管理领域中不可或缺的概念,它们有着密切的联系,但也有明显的差异。SQL是一种用于管理和处理关系型数据库的标准语言,而Oracle则是一个具体的数据库管理系统...

    PostgreSQL 8.2,Oracle 10g,SQL Server 2005,MYSQL 5.1 脚本规范

    标题中的“PostgreSQL 8.2, Oracle 10g, SQL Server 2005, MYSQL 5.1 脚本规范”涉及到的是四个不同的数据库管理系统(DBMS)的脚本编写标准和规范。这四个系统分别是PostgreSQL、Oracle、SQL Server和MySQL,它们都...

    精通sql结构化查询语句

    以SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中...

    经典SQL查询语句大全.rar_sql

    SQL(Structured Query Language)是用于管理和处理关系数据库的标准语言,其功能强大且广泛应用于各种数据库系统,如MySQL、Oracle、SQL Server等。本资源“经典SQL查询语句大全”提供了一系列简单易懂的SQL示例,...

    常用sql语句的收集

    在SQL Server中,掌握一些常见的SQL语句是提高工作效率的关键。以下是一些关于SQL查询的常用技巧和知识点: 1. **去除重复记录**: 使用`GROUP BY`和`HAVING`子句可以去除表中的重复字段。例如,如果你想找出`表`...

Global site tag (gtag.js) - Google Analytics