oracle的start with connect by prior如何使用
https://www.cnblogs.com/lirun/p/9116337.html
--递归查询出自己所有的子课组(包括自己) zkzdm(主课组代码)
select * from t_kck_xxxxkzb start with kzmc in('2','22') connect by prior kzdm=zkzdm
--递归查询出自己所有的父课组(包括自己)
select * from t_kck_xxxxkzb start with kzmc='4' connect by kzdm=prior zkzdm
一、开窗函数
简介: Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行。
概念:这类函数可以将多行数据按照规则聚集为一行,一般来讲聚集后的行数是要少于聚集前的行数的.但是有时我们想要既显示聚集前的数据,又要显示聚集后的数据,这时我们便引入了窗口函数
注意:窗口函数是SQL语句最后执行的函数,还在order by之后
https://blog.csdn.net/weixin_41270824/article/details/89373006
https://blog.csdn.net/qq_26937525/article/details/54925827
二、rownum
简介:在oracle中的rownum作为行号 在分页处理方面有着很大的便利
概念:ROWNUM是对结果集加的一个伪列,即先查到结果集之后再加上去的一个列 (强调:先要有结果集)。简单的说 rownum 是对符合条件结果的序列号。它总是从1开始排起的。所以你选出的结果不可能没有1,而有其他大于1的值。
那你如果你以为只要再排序一下,就可以的话,那么你就错了 .
从上图可以看到,排序后的顺序被打断了,
我们来看看oracle的执行顺序
from .. where ... group by .. having .. select ..rownum.. order by
rownum 是在order by 之前执行的,也就意味着它是先算好行才排序,针对这类问题的解决手法通常是
想办法让order by在 rownum之前执行,那么问题来了,怎么让order by 先执行呢?
答案是, 使用子查询,把子查询放在from 后面,那么就会第一个查询,好了,看代码
select
ROWNUM, t.* //最后执行
from (select * from t_window order by cost) t //该行优先执行
通过上图我们可以发现,我们的思路是正确的,那么我们就顺水推舟,一口气写完 。查询购买量前3条
答案正确,证明我们的思路是没问题的,
那么我们改需求,查询5 - 10 条数据
这时候就是之前提到的rownum特性:因为rownum总是从1开始的如果你使用>,>=,=,between…and这些条件 rownum默认从1开始然后你的条件中又没有1那么他则被删除, 接着取下条,可是它的rownum还是1,又被删除,依次类推,便没有了数据
如果没有输出数据,rownum是不会增加的,所以条件永远不会满足,针对于这种方法,解决方案是 使用子查询先查询 10条数据,然后再取5-10行,
-- 先查询出十行数据
select ROWNUM, t.* from (select * from t_window order by cost) t where rownum <= 10
--然后把这十行当成一个表,在表里面拿5-10行的数据
select t2.* from ( select ROWNUM row_id, t.* from
(select * from t_window order by cost) t where rownum <= 10) t2
where t2.row_id >=5
查询结果如下
注意: ruwnum 查询的时候只能使用< <= 等符号,不能使用 > 的符号,>= 很多情况下都不能使用,建议不要使用 >= 符号