‘WITH AS短语也叫做子查询因子(subquery factoring),主要作用是定义一个SQL片段,该片段会被SQL语句中的其它部分应用到。
主要有这几个作用:
1.使SQL语句的可读性更高一些。(感觉像编程中的本地变量概念,定义好之后,很多地方都可以使用)。
2.提高查询效率。特别是对于UNION ALL和子查询被多次引用的时候。如果UNION ALL的很多部分可能相同,如果每个相同的部分都去执行一遍的话,成本很高,而使用WITH AS短语的话,则相同的部分只会执行一遍。执行方式是如果只被调用一次的话,那么和子查询一样,但是一遍以上的话,则会把WITH AS的数据插入到一个临时表中,这样的话,效率就会大幅度的提高。(这点和本地变量的概念还是一样的,本地变量被赋值了之后,后面调用的都是值,而原来的子查询则像方法调用,每次都是调用一遍,这样性能自然会差一些。)
使用举例:
with samp as (
select aaa,bb,ccc from test where dd = ddd
)
select bb from samp
注:Oracle是在Oracle 9i release 2开始进行支持的,之前的不支持。使用参考: http://dba-oracle.com/t_oracle_subquery_factoring.htm
SQLServer则是在2005的时候已经支持了。使用指南:http://technet.microsoft.com/zh-cn/library/ms175972(v=sql.90)
MySQL现在不支持。可以参考http://stackoverflow.com/questions/1382573/how-do-you-use-the-with-clause-in-mysql