日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle with子句的简单介绍.

發布時間:2025/3/20 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.









《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Oracle with子句的简单介绍.的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。