with as短語,也叫做子查詢部分,可以定義一個(gè)sql片斷,該sql片斷會被整個(gè)sql語句用到。可以使sql語句的可讀性更高,也可以在union all的不同部分,作為提供數(shù)據(jù)的部分。
–針對一個(gè)別名
with?tmp?as?(select?*?from?tb_name)
–針對多個(gè)別名
with tmp?as?(select?*?from?tb_name), tmp2?as?(select?*?from?tb_name2), tmp3?as?(select?*?from?tb_name3), …
–相當(dāng)于建了個(gè)e臨時(shí)表
with?e?as?(select?*?from?scott.emp?e?where?e.empno=7499) select?*?from?e;
–相當(dāng)于建了e、d臨時(shí)表
with e?as?(select?*?from?scott.emp), d?as?(select?*?from?scott.dept) select?*?from?e,?d?where?e.deptno?=?d.deptno;
其實(shí)就是把一大堆重復(fù)用到的sql語句放在with as里面,取一個(gè)別名,后面的查詢就可以用它,這樣對于大批量的sql語句起到一個(gè)優(yōu)化的作用,而且清楚明了。
向一張表插入數(shù)據(jù)的with as用法
insert?into?table2 with s1?as?(select?rownum?c1?from?dual?connect?by?rownum?<p>select s1.sid, s2.sid from s1 ,s2需要有關(guān)聯(lián)條件,不然結(jié)果會是笛卡爾積。</p><p>with as 相當(dāng)于虛擬視圖。</p><p>with as短語,也叫做子查詢部分(subquery factoring),可以讓你做很多事情,定義一個(gè)sql片斷,該sql片斷會被整個(gè)sql語句所用到。有的時(shí)候,是為了讓sql語句的可讀性更高些,也有可能是在union all的不同部分,作為提供數(shù)據(jù)的部分。</p><p>特別對于union all比較有用。因?yàn)閡nion all的每個(gè)部分可能相同,但是如果每個(gè)部分都去執(zhí)行一遍的話,則成本太高,所以可以使用with as短語,則只要執(zhí)行一遍即可。如果with as短語所定義的表名被調(diào)用兩次以上,則優(yōu)化器會自動將with as短語所獲取的數(shù)據(jù)放入一個(gè)temp表里,如果只是被調(diào)用一次,則不會。而提示materialize則是強(qiáng)制將with as短語里的數(shù)據(jù)放入一個(gè)全局臨時(shí)表里。很多查詢通過這種方法都可以提高速度。</p><pre class="brush:sql;toolbar:false;">with sql1?as?(select?to_char(a)?s_name?from?test_tempa), sql2?as?(select?to_char(b)?s_name?from?test_tempb?where?not?exists?(select?s_name?from?sql1?where?rownum=1)) select?*?from?sql1 union?all select?*?from?sql2 union?all select?‘no?records’?from?dual where?not?exists?(select?s_name?from?sql1?where?rownum=1) and?not?exists?(select?s_name?from?sql2?where?rownum=1);
WITH語句的優(yōu)點(diǎn):
(1). SQL可讀性增強(qiáng)。比如對于特定with子查詢?nèi)€(gè)有意義的名字等。
(2)、with子查詢只執(zhí)行一次,將結(jié)果存儲在用戶臨時(shí)表空間中,可以引用多次,增強(qiáng)性能。
舉例:在進(jìn)行導(dǎo)入excel的過程中,有時(shí)候,需要將數(shù)據(jù)存儲在臨時(shí)表中,當(dāng)下一次在進(jìn)行導(dǎo)入的時(shí)候,進(jìn)行清除臨時(shí)表的數(shù)據(jù),但是這時(shí)候,有時(shí)候發(fā)生并發(fā)問題的話,兩個(gè)用戶可能會分別操作對方的數(shù)據(jù),所以,可能造成混亂,但是可以使用WITH函數(shù)和UNION語句拼接一個(gè)SQL語句,存儲在Session中,當(dāng)需要導(dǎo)出錯(cuò)誤信息的時(shí)候,可以使用該語句構(gòu)造數(shù)據(jù)。
相關(guān)推薦:《mysql教程》