1. 程式人生 > >關於oracle with table as的用法

關於oracle with table as的用法

最近在論壇經常看到有人使用with table as語句,一般都是構建一個臨時表,用於測試,經研究此語句的用法我理解有以下好處:

1)  不用實際建表,可以輕鬆構建一個臨時表,通過對這個表的處理測試一些功能;

例如:withas (

select '010-82696948' telfrom dualunionall

select'020 82167684'from dualunion all

select'010-62102147\62104404'from dualunion all

select'0860476-82321383'from dualunion all

select'020-28876096'from dual

union all

select'010-67260464-分機'from dual)

select '086-0'||regexp_replace(replace(regexp_substr(tel,'[0-9]+[- ][0-9]{7}',1,1),'','-'),'^[0]*86[0]|^0','')from t;

--對各種格式電話號碼做規範化處理

2)  複雜的查詢會產生很大的sql,with table as語法可以把一些公共查詢提出來,也可以顯示一個個中間結果,可以使整個sql語句顯得有條理些,可讀性提高;

3)  前面的中間結果可以被語句中的select或後面的中間結果表引用,類似於一個範圍僅限於本語句的臨時表,在需要多次查詢某中間結果時可以提升效率 ,特別是對一些大資料量的表做多項統計時,可以大大提高效率。 

例如: 

with a as (select * from dba_objects where 某些查詢條件),
     b as (select * from a where 某些查詢條件)
     select * from b , a  where 其它查詢條件;

再比如:

with tb as (select * from dba_objects where 某些查詢條件),
          select count(*) from tb  where 其它查詢條件1

          union

          select count(*) from tb  where 其它查詢條件2

          union

          select count(*) from tb  where 其它查詢條件3;

1、語法

with table as 相當於建個臨時表(用於一個語句中某些中間結果放在臨時表空間的SQL語句),Oracle 9i 新增WITH語法,可以將查詢中的子查詢命名,放到SELECT語句的最前面。

語法就是
with tempname as (select ....)
select ...

例子:
with t as (select * from emp where depno=10)
select * from t where empno=xxx

with wd as (select did,arg(salary) 平均工資 from work group by did),
em as (select emp.*,w.salary from emp left join work w on emp.eid = w.eid)
select * from wd,em where wd.did =em.did and wd.平均工資>em.salary;

=============================================================

 注意:這個臨時表只能用於查詢,不能用於更新,如:

ith tt as ( select to_char(sysdate,'yyyymmdd') rq from dual )
update song_temp set code=( select rq from tt) where code='11';

這個語句會報錯:ora-00928: 缺失select關鍵字!

2、何時被清除

臨時表不都是會話結束就自動被PGA清除嘛! 但with as臨時表是查詢完成後就被清除了!
23:48:58
[email protected]> with aa as(select * from dept)
23:57:58   2  select * from aa;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON

已用時間:  00: 00: 00.12
23:58:06
[email protected]> select * from aa;
select * from aa
              *
第 1 行出現錯誤:
ORA-00942: 表或檢視不存在


已用時間:  00: 00: 00.02
23:58:14
[email protected]>

3、舉例

假定有張很大的表,有幾年來的經營資料,資料量很大。如果要統計一段時間內的郵件狀態,如果都從總表中統計,效率一定不高,而採用with tablename as 語句,先將一段時間內的資料取出來,再進行統計就會簡單的多。

with tb as (

select b.city,a.mail_num,a.rcv_area from tb_evt_mail_clct a, tb_jg b

         where a.clct_date = to_date('20110816', 'yyyymmdd')

           and (a.rcv_area like '23%' or a.rcv_area like '24%')

           and a.clct_bureau_org_code = b.zj_code

           and not exists (select 1 from tb_evt_dlv c

                 where c.mail_num = a.mail_num

                   and c.dlv_sts_code = 'I')

                   )   -- 提取出查詢資料

select aa.city 收寄城市, aa.wtt 未妥投, bb.wtd 未投遞, cc.wkc 未開拆

  from (select tb.city, count(*) wtt

          from tb

         group by tb.city) aa  -- 統計1

  left join (select tb.city, count(*) wtd

               from tb

                where  not exists

              (select 1 from tb_evt_dlv c

                      where c.mail_num = tb.mail_num

                        and (c.dlv_sts_code = 'H' or c.dlv_sts_code = 'I'))

              group by tb.city) bb on bb.city = aa.city  -- 統計2

  left join (select tb.city, count(*) wkc 

               from tb

              where not exists

              (select 1  from tb_evt_dlv c

                      where c.mail_num = tb.mail_num

                        and (c.dlv_sts_code = 'H' or c.dlv_sts_code = 'I'))

                and not exists

              (select 1 from tb_evt_bag_mail_rela e

                      where e.mail_num = tb.mail_num

                        and e.bag_actn_code = '2'

                        and e.deal_org_code like

                            substr(tb.rcv_area, 1, 4) || '%')

              group by tb.city) cc on cc.city = aa.city -- 統計3

相關推薦

關於oracle with table as用法

最近在論壇經常看到有人使用with table as語句,一般都是構建一個臨時表,用於測試,經研究此語句的用法我理解有以下好處: 1)  不用實際建表,可以輕鬆構建一個臨時表,通過對這個表的處理測試一些功能;例如:with t as (select '010-8269694

Oraclewith as用法

分組 關鍵字 視圖 group 高效 這也 過程 avi 臨時 with as 相當於虛擬視圖。 例子:需求描述 按照x列分組後統計y列的總值,最終目標是選出比y列總值的三分之一大的那些分組統計信息 使用子查詢方式實現最容易想到的方法 SELECT x, SUM (y)

ORACLE WITH AS 用法,創建臨時表

進一步 有用 cin AI 運行 結構 nbsp index ring 語法: with tempName as (select ....)select ... –針對一個別名with tmp as (select * from tb_name) –針對多個別名wi

關於oracle with as用法

order tro http 部分 itl query with as 結果 nta with as語法–針對一個別名with tmp as (select * from tb_name) –針對多個別名with tmp as (select * from tb_nam

三十、 ORACLE WITH AS 用法

                ORACLE WITH AS 用法 With查詢語句不是以select開始的,而是以“WIT

ORACLE WITH AS 用法

語法: with tempName as (select ....) select ... 例:現在要從1-19中得到11-14。一般的sql如下: select * from ( --模擬生一個20行的資料

關於Oracle中的aswith as用法

在Oracle中as關鍵字不能用於指定表的別名,在Oracle中指定表的別名時只需在原有表名和表的別名之間用空格分隔即可, 但可以用於指定列的別名,但在儲存過程中如果列的別名與原有列名相同,在執行時會報錯(編譯時不會出錯),其他情況下 列的別名可以與列名本身相同。 在查詢oracle中as關鍵字的用

ORACLE創建臨時事務表global temporary table 和 查詢時臨時表with tempName as (select ) select

query 問題 weight select 別名 onf bold hellip course 創建臨時事務表只是保存當前會話(session)用到的數據,數據只在事務或會話期間存在,可規避多線程調用數據沖突問題 -- Create table create glo

ORACLE with..as...語句

oracle with...as... with...as ...語句用於將查詢語句定義為某個名稱,並可以再後續的查詢塊中引用。當查詢名稱與已有的表名重復時,with定義的查詢塊優先級高。with語句可以定義多個查詢,中間使用逗號分隔。常用於定於需要反復查詢某些表的視圖中,使用with語

公用表達式 CTE with as 用法總結

efi 用法 sta 使用方法 屬於 actor 這就是 oge union 出處: http://wudataoge.blog.163.com/blog/static/80073886200961652022389/ 一.WITH AS的含義 WITH AS短語,

Oracle with..as使用方法

一、簡介 with..as關鍵字,是以‘with’關鍵字開頭的sql語句,在實際工作中,我們經常會遇到同一個查詢sql會同時查詢多個相同的結果集,即sql一模一樣,這時候我們可以將這些相同的sql抽取出來,使用with..as定義。with..as相當於一張中間表,可以簡單理解為sql片段(類似

Oracle 中create table as 複製表結構

Oracle 中create table as 複製表結構 在日常測試或者資料遷移的過程中,經常使用create table as …複製表結構或者複製表結構和資料,用法如下: 複製表結構:create table tab_target as select * from table wh

oracle 儲存過程之 open 遊標 for with t2 as ()

在專案中見到這樣的儲存過程程式碼: procedure    procedure_name (out_param  out   cursorType,  out_param2  out   cursorType,  in_param  in   cursorType )

With tempTabel as (select...)臨時表的用法詳解

最近優化sql,發現這個臨時表真是個好東西。分享出來 (1)with基礎 使用WITH AS 語句可以為一個子查詢語句塊定義一個名稱,使用這個子查詢名稱可以在查詢語句的很多地方引用這個子查詢。Oracle 資料庫像對待內聯檢視或臨時表一樣對待被引用的子查

1z0-071 Oracle Database 12c SQL 第68題 CREATE TABLE AS

Q68. View the exhibit and examine the structure of the SALES, CUSTOMERS, PRODUCTS and TIMES tables.The PROD_ID column is the foreign key i

create table as 復制not null

null 插入 creat created into type from columns err 創建一張表包含非空約束,唯一約束和check約束 SQL> create table dept( 2 ename varchar2(20) constraint me

Oracle中Merge into用法總結 (轉載)

字符 存在 sin 刪除 ron mic 但是 多個 前段時間 Oracle中Merge into用法總結 (出處:http://www.cnblogs.com/dongsheng/p/4384754.html) 起因:   前段時間,因為涉及到一張表的大數據操作,要同時

oracle 函數的用法(三)

order 全局 接收 報錯 sysdate times 變量 pda was -- 函數 1.oracle自帶的標準函數 to_date,to_number2.自定義函數 -- 自定義函數語法 1 CREATE OR REPLACE FUNCTION FUNCTION_

READ TABLE用法

如果 tab 系統 表數據 內部 family 設置 bin 條目 1. 如果使用READ TABLE語句來讀取內部表數據,而不是簡單看返回值判斷是否存在, 那麽在使用READ TABLE語句之前,一定要記得使用CLEAR語句清空內部表的工作區。 2.

sql語句EXISTS的用法oracle中substr的用法

參數 ... ble 索引 效率 put www 長度 重復記錄 轉需:EXISTS 指定一個子查詢,檢測 行 的存在。語法: EXISTS subquery參數: subquery 是一個受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關鍵字)。