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

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

最近看到历史项目里面的很多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,这种写法,总比所有语句拼在一起好很多吧。反正我是这么认为的, 只能代表个人观点了,公司有些人还是不认同,我也没办法。每个人都有自己的风格。

上一篇: Django 1.11 自定义标签之后,可以不在每个html页面引用就生效吗?
下一篇: python3,Django验证码生成方法
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号