Oracle with子句的简单介绍.
在ocp題庫中有一題是關于with語句的.
Which statements are true regarding the usage of the WITH clause in complex correlated subqueries?
(Choose all that apply.)
A. It can be used only with the SELECT clause.
B. The WITH clause can hold more than one query.
C. If the query block name and the table name were the same, then the table name would take
precedence.
D. The query name in the WITH clause is visible to other query blocks in the WITH clause as well as to
the main query block.
下面會以這題作個例子簡單介紹下with子句的作用與用法.
1.with子句的作用
實際上, Oracle可以利用with子句為子查詢的數據集作為1個內存臨時表.? 在內存中解析,提高了執行效率. 而且提高了SQL語句的可讀性.
2.with語句的用法與特性
語法很簡單:
下面是1個簡單的例子:
with Q1 as (select product_id, product_name from products where rownum <= 10)select * from Q1 ;PRODUCT_ID PRODUCT_NAME ---------- -----------------------------------------------------------------------------------------------------------------------------1797 Inkjet C/8/HQ 2459 LaserPro 1200/8/BW 3127 LaserPro 600/6/BW 2254 HD 10GB /I 3353 HD 10GB /R 3069 HD 10GB /S 2253 HD 10GB @5400 /SE 3354 HD 12GB /I 3072 HD 12GB /N 3334 HD 12GB /R可以見到,? 上面的Q1為括號的子查詢的別名, 相當于在內存里建立了1張臨時表.? 下面的select 語句就直接檢索這張臨時表.
下面是一些比較重要的特性.
2.1 with子句后必須接著select 語句, 否則出錯
例如下面的例子
with Q1 as (select product_id, product_name from products where rownum <= 10)delete from products where 1 =2 ;select * from products where 1 =2;在行 14 上開始執行命令時出錯: with Q1 as (select product_id, product_name from products where rownum <= 10)delete from products where 1 =2 命令出錯, 行: 17 列: 4 錯誤報告: SQL 錯誤: ORA-00928: 缺失 SELECT 關鍵字 00928. 00000 - "missing SELECT keyword" *Cause: *Action: 未選擇任何行2.2 1個with子句里可以定義多個內存臨時表, 而且可以互相使用.
如下面的經典例子:
WITH Q1 AS (SELECT 3 + 5 S FROM DUAL), Q2 AS (SELECT 3 * 5 M FROM DUAL), Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2) SELECT * FROM Q3; S M S+M S*M ---------- ---------- ---------- ----------8 15 23 120可以簡單上面定義了3個那次臨時表Q1, Q2, Q3, 其中Q3 使用了臨時表Q1 和 Q2
2.3 with定義的內存臨時表一旦被select 語句檢索一次, 那么系統就會在內存中清理掉這張臨時表
如上面的例子增加一句select * from Q2.
WITH Q1 AS (SELECT 3 + 5 S FROM DUAL), Q2 AS (SELECT 3 * 5 M FROM DUAL), Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2) SELECT * FROM Q3; select * from Q2;ORA-00942: 表或視圖不存在 00942. 00000 - "table or view does not exist" *Cause: *Action: 行 42 列 15 出錯
出錯了, 因為Q2 已經被with里的Q3檢索過一次, 被刪掉了.? 實際上再select 一次 Q3也是會出錯的.
所以網上所講, with定義的臨時表能多次使用我覺得是錯的.
可能內存空間珍貴的原因, oracle為with語句設定這個機制, 請允許我做1個悲傷的表情囧.
2.4 with子句定義的臨時表命不能于已存在的表名重復.
例子
withproducts as (select product_id, product_name from products where rownum <= 10)select * from products ;在行 21 上開始執行命令時出錯: withproducts as (select product_id, product_name from products where rownum <= 10)select * from products 命令出錯, 行: 22 列: 54 錯誤報告: SQL 錯誤: ORA-32039: 遞歸 WITH 子句必須具有列別名列表
3. 最后解析下開頭的題目選項
選項A的意思是with子句必須用于select語句中.
根據2.1 和 2.3 的特性, 可見這個選項是正確的, with定義的內存臨時表不能用于除 select 語句外的DML語句.
選項B的意思是, 1個with子句中可以定義多個內存臨時表.
根據2.2的特性, 也是正確的.
選項C的意思是, 如果with定義的內存臨時表名與真實表名重復, 會被優先認為是真實表名.
根據2.4 特性, 是錯誤的.
選項D的意思是,? with子句里其中1個內存臨時表能被這個with子句內的其他內存臨死表使用,
根據2.3特性, 也是正確的.
所以答案是ABD.
總結
以上是生活随笔為你收集整理的Oracle with子句的简单介绍.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库范式介绍
- 下一篇: Oracle TO_YMINTERVAL