V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ukipoi
V2EX  ›  问与答

请教一个 SQL 的问题,如何简化 oracle 的 sql?

  •  
  •   ukipoi · 2020-01-08 10:06:25 +08:00 · 449 次点击
    这是一个创建于 1584 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题是这样的,是我写了一个 sql,但是实际运行是程序解析 sql 语句来执行的。
    但是执行的时候程序出了栈溢出的错误,好像是正则解析的时候出了问题。
    所以我想是不是要简化我的 sql,不过不是对 sql 很熟。
    sql 主要是查询 table_b 的表中两个时间段的数据,合成一个表,然后关联下其他表中的字段,请问我该如何把这个 sql 弄的更简单写呢?

    --加上 table_d 表的 id 字段
    --时间用的这么复杂是因为到时候'2019-12-01 00:00:00'是程序传入的值
    select n.id,m.d_id,m.i_id,m.item1_add,m.item2_add,m.item1_ini,m.item1_fin,m.item2_ini,m.item2_fin,m.item_r,m.data_month from
        (
            --把 item 的结果值乘以一个倍率,带上 table_c 表的 d_id 字段
            select item1_ini,item1_fin,item2_ini,item2_fin,item_r,i_id,d_id,item1*nvl(item_r,0) as item1_add,item2*nvl(item_r,0) as item2_add,
                to_date(to_char(to_date('2019-12-01 00:00:00','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm'),'yyyy-mm') as data_month from
                (
                    --对查出来的结果新增两个计算结果的字段
                    select item1_ini,item1_fin,item2_ini,item2_fin,id,i_id,nvl(item1_fin,0)-nvl(item1_ini,0) as item1,
                        nvl(item2_fin,0)-nvl(item2_ini,0) as item2 from
                        (
                            --查出 12 月分和 11 月分的数据合成一个新的表
                            (
                                select id,i_id,item1 as item1_fin,item2 as item2_fin from table_b where data_time like 
                                    to_date(to_char(to_date('2019-12-01 00:00:00','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm'),'yyyy-mm')
                            ) a left join
                            (
                                select id as id_bak,i_id as i_id_bak,item1 as item1_ini,item2 as item2_ini from table_b where data_time like 
                                    add_months(to_date(to_char(to_date('2019-12-01 00:00:00','yyyy-mm-dd hh24:mi:ss'),'yyyy-mm'),'yyyy-mm'),-1)
                            ) b on a.id=b.id and a.i_id=b.i_id
                        )
                ) c left join 
                (
                    select i_id as i_id_d,item_r,d_id from table_c
                ) d on c.i_id=d.i_id_d
        ) m,table_d n where m.d_id=n.dp_id
    
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3153 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 14:22 · PVG 22:22 · LAX 07:22 · JFK 10:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.