深入sql oracle递归查询
网络编程 2021-07-05 16:08www.168986.cn编程入门
本篇文章是对sql oracle 递归查询进行了详细的分析介绍,需要的朋友参考下
☆ 获取数据库所有表名,表的所有列名
select name from sysobjects where xtype='u'
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')
☆ 递归查询数据
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
--狼蚁网站SEO优化的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
--狼蚁网站SEO优化的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;
--狼蚁网站SEO优化是递归删除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如下
--狼蚁网站SEO优化的Sql是查询出1结点的所有子结点
SELECT FROM aaa
START WITH id = 1
CONNECT BY pid = PRIOR id
--狼蚁网站SEO优化的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 -- 本月金额大于任务额时的返利点,返利额为jefld
) 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
select name from sysobjects where xtype='u'
select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='表名')
☆ 递归查询数据
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
--狼蚁网站SEO优化的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
--狼蚁网站SEO优化的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;
--狼蚁网站SEO优化是递归删除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如下
--狼蚁网站SEO优化的Sql是查询出1结点的所有子结点
SELECT FROM aaa
START WITH id = 1
CONNECT BY pid = PRIOR id
--狼蚁网站SEO优化的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 -- 本月金额大于任务额时的返利点,返利额为jefld
) 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
编程语言
- 甘肃哪有关键词排名优化购买方式有哪些
- 甘肃SEO如何做网站优化
- 河南seo关键词优化怎么做电话营销
- 北京SEO优化如何做QQ群营销
- 来宾百度关键词排名:提升您网站曝光率的关键
- 卢龙关键词优化:提升您网站排名的策略与技巧
- 山东网站优化的注意事项有哪些
- 四川整站优化怎样提升在搜索引擎中的排名
- 疏附整站优化:提升网站性能与用户体验的全新
- 海南seo主要做什么工作售后服务要做到哪些
- 荣昌百度网站优化:提升您网站的搜索引擎排名
- 河北seo网站排名关键词优化如何做SEO
- 江西优化关键词排名推广售后保障一般有哪些
- 古浪SEO优化:提升你的网站可见性
- 西藏网站排名优化怎么把网站排名在百度首页
- 如何提升阳东百度快照排名:详尽指南