☆ 获取数据库所有表名,表的所有列名

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

--下面的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 oracle 递归查询语句,深入sql oracle递归查询相关推荐

  1. oracle快捷语句框架中,Oracle框架:PL/SQL编程:

    PL/SQL编程 一:什么是PL/SQL (1.)PL/SQL体系结构: PL/SQL引擎用来编译和执行,PL/SQL块或子程序,该引擎驻留在Oracle服务器中. (2.)PL/SQL块简介 PL/ ...

  2. oracle 分页语句效率高,Oracle 10g SQL分页查询语句和效率分析

    下面统计一下这张表中的记录数: SQL> select count(*) from customers; COUNT(*) ---------- 55500 已用时间:  00: 00: 00. ...

  3. oracle 执行语句显示2,Oracle执行语句跟踪(2)——使用10046事件实现语句追踪

    接上篇博文Oracle执行语句跟踪(1)--使用sql trace实现语句追踪,一旦我们通过会话追踪获取到超时事物的执行语句,就可以使用10046事件对语句进行追踪. 启用10046事件追踪的方式 S ...

  4. oracle sql 分区查询语句_Oracle SQL调优之分区表

    一.分区表简介 分区通过让您将它们分解为更小且更易于管理的分区(称为分区)来解决支持非常大的表和索引的关键问题.不需要修改SQL查询和DML语句以访问分区表.但是,在定义分区之后,DDL语句可以访问和 ...

  5. oracle sql循环判断语句怎么写,Oracle 非常详细的 PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理...

    PL/SQL入门教程目录 Oracle PL/SQL入门教程,PL/SQL语法格式/循环语句/条件判断/异常处理 一.PL/SQL简介 1.PL/SQL简介 1.PL/SQl是过程语言PL与结构化语言 ...

  6. oracle sq语句查询时间,Oracle实现查询时间段的Sql语句两法

    Oracle实现查询时间段的Sql语句两法,相比ORacle要查询时间段的Sql语句还是与Sql Server的Sql语句有区别的,下面举两种方法来说明在ORacle是如何查询时间段的: 第一种方法: ...

  7. mysql sql 连接查询语句_Mysql——sql数据库中的连接查询

    1.1.1   交叉连接(CROSS JOIN) 交叉连接(CROSS JOIN):有两种,显式的和隐式的,不带ON子句,返回的是两表的乘积,也叫笛卡尔积. 例如:下面的语句1和语句2的结果是相同的. ...

  8. SQL常用基础语句(SQL常用增删改查语句及案例)

    一.添加数据 语法: * insert into 表名(列名1,列名2,...列名n) values(值1,值2,...值n); 注意: (1) 列名和值要一一对应. (2) 如果表名后,不定义列名, ...

  9. oracle 更新语句不生效,Oracle存储过程执行update语句不报错不生效问题

    转载链接:http://lin49940.iteye.com/blog/466626 今天一个同事写oracle 的存储过程遇到了一个问题, 他在里面update 操作不能完成更新的操作, 但是又不会 ...

最新文章

  1. 一劳永逸-解决人类未来长期-暴露在病毒的方案-致所有中国的科技公司一封信
  2. zend studio让编译器导入项目为utf-8如何设置
  3. python问题解决方案_Python安装、遇到的问题及解决方案,python,和,方法
  4. 怎么打断点_孩子注意力不集中怎么办?7招提升儿童专注力,方法简单效果好...
  5. python颜色输出
  6. 一篇文章搞懂数据仓库:元数据分类、元数据管理
  7. Navicat基础mysql语法
  8. vs运行c语言代码快捷键,VS2010快捷键
  9. python下载安装教程(详细步骤+图示)
  10. 如何用30分钟快速优化家中Wi-Fi?阿里工程师有绝招
  11. EBS R12中SLA子分类帐与子模块的关联关系
  12. UVALive-3713 Astronauts (2-SAT)
  13. 利用Backtrader进行期权回测之五:用backtrader_plotting查看回测结果
  14. requests爬取链家网房源数据
  15. 苹果系统 python闪退怎么解决_MacOS pyinstaller 打包python应用闪退问题解决
  16. 202012798范明霞的博客
  17. LZY的计算器(暴力)
  18. Centos7.6 2T以上硬盘GPT分区工具使用挂载教程
  19. 普里姆算法解决修路问题
  20. 【从零开始JavaEE课设】《影院系统》成品展示——后台管理系统

热门文章

  1. Linux导出history命令到本地
  2. linux设备驱动模型及其他,Linux设备驱动模型
  3. 校园录html源码,校园录播系统设计方案(20页)-原创力文档
  4. php读写分离是什么意思,php mysql读写分离
  5. 快速排序算法c语言lomuto,快速排序(N.Lomuto版)
  6. 【SparkStreaming学习之二】 SparkStreaming算子操作
  7. TortoiseSVN版本管理的注意点
  8. eclipse检测不到android的手机
  9. 兼容所有浏览器的设为首页收藏本站js代码,推荐使用
  10. c# 基本语法(转)