建议复杂的oracle嵌套查询用with as 语句来处理,要么用中间表
By:Roy.LiuLast updated:2017-09-02
最近看到历史项目里面的很多SQL, 我已经很无语了, 一段SQL 里面层层嵌套,而且有的嵌套层还是一样的。只是稍稍一点点条件不同而已。我见到了一个让我分析了一两个小时的SQL。 因为不是很懂原来的业务,只能从SQL 去倒推,猜想业务是什么样的。
SQL 我也就不贴出来了。毕竟这是公司项目里面的东西,也是以前同事写的, 贴出来,有点见不得人。一条SQL 总共有8层嵌套。比如:
当然我这个例子,不能真是代表具体的场景,里面还有很多left join 的东西,关联不同表处理的东西,所以上面这个伪代码并不能表现真实场景。
看这样嵌套很多层,而且有部分重复代码的SQL ,我一般都认为原来这个哥们没有把业务梳理清楚,导致表结构设计不合理。所以后来SQL 也就乌七八糟,东拼西凑能出结果就行,从来不考虑开发的难度与执行的效率。
其实想这样的东西,首先应该更改设计,表结构设计,是不是可以加入中间表,或者说加入某些冗余字段, 后面可以让查询变得很简单,性能也好。
另外,实在没办法的时候,也尽量将里面的嵌套SQL的重复代码,或者功能独立部分的SQL 抽取出来作为类似临时表的样子,这样也总比层层嵌套SQL 去看容易多了吧。
如果是ORACLE, 建议考虑下 WITH AS 语法,很多复杂的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,这种写法,总比所有语句拼在一起好很多吧。反正我是这么认为的, 只能代表个人观点了,公司有些人还是不认同,我也没办法。每个人都有自己的风格。
From:一号门
COMMENTS