with
as也叫做子查询部分,首先定义一个sql片段,该sql片段会被整个sql语句所用到,为了让sql语句的可读性更高些,作为提供数据的部分,也常常用在union等集合操作中。with
as最大的好处就是适当的提高代码可读性,而且如果with子句在后面要多次使用到,这可以大大的简化SQL。
关于with as子句的用法,下面两个例子看看就OK了:
--例子1
WITHdept_costsAS
(SELECTd.department_name,SUM(e.salary)ASdept_total
FROMemployeese,departmentsd
WHEREe.department_id=d.department_id
GROUPBYd.department_name),
avg_costAS
(SELECTSUM(dept_total)/COUNT(*)ASdept_avgFROMdept_costs)
SELECT*
FROMdept_costs
WHEREdept_total>(SELECTdept_avgFROMavg_cost)
ORDERBYdepartment_name;
--例子2
WITHsql1AS
(SELECTto_char(a)s_nameFROMtest_tempa),
sql2AS
(SELECTto_char(b)s_name
FROMtest_tempb
WHERENOTEXISTS(SELECTs_nameFROMsql1WHERErownum=1))
SELECT*
FROMsql1
UNIONALL
SELECT*
FROMsql2
UNIONALL
SELECT'norecords'
FROMdual
WHERENOTEXISTS(SELECTs_nameFROMsql1WHERErownum=1)ANDNOTEXISTS(SELECTs_name
FROMsql2
WHERErownum=1);
在oracle数据库开发中有时候要对临时数据的一些处理,但是这些数据又不想放到table里面而且cursor的灵活性又不是很好。这个时候可以考虑with as。
with as是在内存中建立一个临时的table。可以对这个temp table里面的数据进行整理。
得到一个temp table就可以对table的记录进行操作了,例如求平均数。
还可以和现有的table进行查询。
由于with as是内存中的table所以还是比较快的。如果数据比较大的时候建议不要用with as这样的话变得很慢。