首页 > 数据库 >Oracle with的重复使用(递归)

Oracle with的重复使用(递归)

时间:2023-03-12 13:57:49浏览次数:46  
标签:arrival cnt capacity 递归 bus 重复使用 time Oracle id

Oracle with的重复使用(递归)

写力扣的时候学到了新的方法 Recursive WITH Clauses

通常来说如果直接使用with XXX as ()这种,是没发直接使用自身的数据的

例如

/* Write your PL/SQL query statement below */
with maina as ( 
    select distinct p.post_id,k.topic_id
    from Posts p left join Keywords k
     on 
    instr(lower(' '||p.content||' '), lower(' '||k.word||' ')) > 0 order by p.post_id,k.topic_id
),
mainb as (
    select b.post_id,listagg(nvl(b.topic_id,'999'),',') within group(order by b.topic_id) as list from maina b group by b.post_id
)

select c.post_id,decode(c.list,'999','Ambiguous!',c.list) as topic from mainb c 

但是如果将格式换成 with table_name(XX,XX,XX,XX,XX) as ()

就可以在with的代码段中直接调用自己的结果,效果和常用的递归手段,如CONNECT_BY_ROOT是差不多的,比connect by prior多分层

例如(直接用别人的sql了)

with bus_store(bus_id,capacity,cnt,arrival_time,rn) as (
    select c.* 
    from 
    (
        select bus_id, capacity, count(b.passenger_id) cnt,a.arrival_time,
        row_number() over(order by a.arrival_time) rn 
        from 
        (
            select bus_id,capacity,arrival_time 
            from Buses
        ) a  left join Passengers b 
        on(b.arrival_time<=a.arrival_time)
        group by bus_id,capacity,a.arrival_time
    ) c
),
result(bus_id,cnt,diff,passengers_cnt,arrival_time,rn) as (
    select bus_id,cnt,
    case when capacity >= cnt then 0 else cnt-capacity end,
    case when capacity >= cnt then cnt else capacity end,
    arrival_time,rn 
    from bus_store
    where rn=1
    union  all 
    select a.bus_id,a.cnt,
    case when a.cnt - b.cnt + b.diff >= a.capacity then a.cnt - b.cnt + b.diff - a.capacity else 0 end,
    case when a.cnt - b.cnt + b.diff >= a.capacity then a.capacity else a.cnt - b.cnt + b.diff end,
    a.arrival_time,a.rn 
    from bus_store a join result b 
    on(a.arrival_time > b.arrival_time) 
    where a.rn = b.rn + 1
)

select bus_id,passengers_cnt from result order by bus_id

标签:arrival,cnt,capacity,递归,bus,重复使用,time,Oracle,id
From: https://www.cnblogs.com/jokingremarks/p/17208057.html

相关文章

  • PostgreSQL和Oracle的数据类型的对比:大数据类型
    PostgreSQL和Oracle的数据类型的对比:大数据类型 木马童年2018-12-2923:1021220 PostgreSQL是世界上功能最强大的开源数据库,在国内得到了越来越多机构和开发者的青......
  • LINUX下安装Oracle监听报错Error: null
    今天在安装Oracle配置监听的时候执行netca报错:Error:nullCheckthetracefilefordetails:/u01/app/oracle/cfgtoollogs/netca/trace_OraDB12Home1-2303119PM5318.log......
  • 汉诺塔问题——分而治之(引入递归,解决重复子问题)
    汉诺塔问题的引入:相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图......
  • jdbc 链接 oracle 查询
    Oracle默认端口号为:1521Stringurl="jdbc:oracle:thin:@localhost:1521:orcl";报错1:ClassNotFoundException:oracle.jdbc.driver.OracleDriver:缺少pom依赖:<depen......
  • Oracle Schema
    看来有的人还是对schema的真正含义不太理解,现在我再次整理了一下,希望对大家有所帮助。我们先来看一下他们的定义:A schema isa collection ofdatabaseobjects(used......
  • oracle建表语句,添加主键、索引、注释,插入数据,添加序列
    createtableFND_COMPANIES_42624(COMPANY_IDnumber(3)primarykey,--公司IDnumber序列COMPANY_CODEVARCHAR2(30)notnull,--公司......
  • oracle 口令文件
    口令文件介绍以特权用户身份(SYS/SYSDBA/SYSOPER)登录ORALCE数据库有两种验证方法:即使用与操作系统集成的身份验证使用ORALCE数据库的密码文件进行身份验证。ORALCE......
  • db + mysql vs oracle
    smysql与oracle的几点区别序号mysqloracle备注1.组函数用法规则mysql中组函数在select语句中可以随意使用oracle中如果查询语句中有组函数,那其他列名必须是......
  • 递归
    什么时候需要用递归:但业务逻辑明显重复时,并且存在一个量是规律性变少直至终点就可以考虑到递归算法需要元素:递归的逻辑方法:这是最重点,这个方法应该是某一递归层级相邻......
  • 计算一个数的每位之和(递归实现)
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>/*思路:nn<10DigiSum(n)=DibiSum(n/10)+n%10//前n-1位之和+第N位*/intDigitSum(i......