建议复杂的oracle嵌套查询用with as 语句来处理,要么用中间表

最近看到历史项目里面的很多SQL, 我已经很无语了, 一段SQL 里面层层嵌套,而且有的嵌套层还是一样的。只是稍稍一点点条件不同而已。我见到了一个让我分析了一两个小时的SQL。 因为不是很懂原来的业务,只能从SQL 去倒推,猜想业务是什么样的。

SQL 我也就不贴出来了。毕竟这是公司项目里面的东西,也是以前同事写的, 贴出来,有点见不得人。一条SQL 总共有8层嵌套。比如:
程序代码 程序代码

select * from  
    (select * from (
             select * from (
                   select * from (
                       继续在里面嵌套.....
                   )
                    
             )
             left join .....
         )
          
     )


当然我这个例子,不能真是代表具体的场景,里面还有很多left join 的东西,关联不同表处理的东西,所以上面这个伪代码并不能表现真实场景。

看这样嵌套很多层,而且有部分重复代码的SQL ,我一般都认为原来这个哥们没有把业务梳理清楚,导致表结构设计不合理。所以后来SQL 也就乌七八糟,东拼西凑能出结果就行,从来不考虑开发的难度与执行的效率。

其实想这样的东西,首先应该更改设计,表结构设计,是不是可以加入中间表,或者说加入某些冗余字段, 后面可以让查询变得很简单,性能也好。

另外,实在没办法的时候,也尽量将里面的嵌套SQL的重复代码,或者功能独立部分的SQL 抽取出来作为类似临时表的样子,这样也总比层层嵌套SQL 去看容易多了吧。

如果是ORACLE, 建议考虑下 WITH AS 语法,很多复杂的SQL 的时候,真的用得上,而且逻辑清晰,好理解。

程序代码 程序代码

with my_temp_1 as (
   select ... 复杂的语句, 一部分清晰的逻辑
),
my_temp_2 as (
   select .... 复杂的语句,一部分清晰的逻辑
)
select a.*, b.column1,b.column2 from my_temp_1 a left join my_temp_2  b on a.id=b.relid
where ......


对于复杂的SQL,这种写法,总比所有语句拼在一起好很多吧。反正我是这么认为的, 只能代表个人观点了,公司有些人还是不认同,我也没办法。每个人都有自己的风格。

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: oracle database
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.