SQL中使用WITH 語句的查詢
sql with as 用法(適用sqlserver,好像oracle也適用) Server 2005中提供了公用表表達式(CTE),使用CTE,可以使SQL語句的可維護性,同時,CTE要比表變量的效率高得多。
下面是CTE的語法: [ WITH
如下面的SQL語句將無法正常使用CTE: with cr as ( select CountryRegionCode from *yRegion where Name like 'C%' ) select * from *yRegion -- 應將這條SQL語句去掉 -- 使用CTE的SQL語句應緊跟在相關的CTE后面 -- select * from *rovince where CountryRegionCode in (select * from cr) 2. CTE后面也可以跟其他的CTE,但只能使用一個with,多個CTE中間用逗號(,)分隔,如下面的SQL語句所示: with cte1 as ( select * from table1 where name like 'abc%' ), cte2 as ( select * from table2 where id > 20 ), cte3 as ( select * from table3 where price < 100 ) select a.* from cte1 a, cte2 b, cte3 c where * = * and * = * 3. 如果CTE的表達式名稱與某個數據表或視圖重名,則緊跟在該CTE后面的SQL語句使用的仍然是CTE,當然,后面的SQL語句使用的就是數據表或視圖了,如下面的SQL語句所示: -- table1是一個實際存在的表 with table1 as ( select * from persons where age < 30 ) select * from table1 -- 使用了名為table1的公共表表達式 select * from table1 -- 使用了名為table1的數據表 4. CTE 可以引用自身,也可以引用在同一 WITH 子句中預先定義的 CTE。不允許前向引用。
5. 不能在 CTE_query_definition 中使用以下子句: (1)COMPUTE 或 COMPUTE BY (2)ORDER BY(除非指定了 TOP 子句) (3)INTO (4)帶有查詢提示的 OPTION 子句 (5)FOR XML (6)FOR BROWSE 6. 如果將 CTE 用在屬于批處理的一部分的語句中,那么在它之前的語句必須以分號結尾,如下面的SQL所示: declare @s nvarchar(3) set @s = 'C%' ; -- 必須加分號 with t_tree as ( select CountryRegionCode from *yRegion where Name like @s ) select * from *rovince where CountryRegionCode in (select * from t_tree) 7、CTE除了可以簡化嵌套SQL語句外,還可以進行遞歸調用。
oracle語句start with connect by prior 效率怎么樣
查看當前用戶的缺省表空間
SQL>select username,default_tablespace from user_users;
查看當前用戶的角色
SQL>select * from user_role_privs;
查看當前用戶的系統權限和表級權限
SQL>select * from user_sys_privs;
SQL>select * from user_tab_privs;
oracle 序列,是否有更改START WITH 的語句
理論上ORACLE序列,除了START值外任何參數都可以修改
當然最常用的就是先減去xx,然后增加
ALTER SEQUENCE SEQ INCREMENT -500;
SELECT *L FROM DUAL; --會得到0
ALTER SEQUENCE SEQ INCREMENT BY 1
還是DB2勁,可以直接修改
ALTER SEQUENCE SEQ RESTART WITH 5
請教大師oracle的with as子句的問題
with as語法–針對一個別名with tmp as (select * from tb_name)–針對多個別名withtmp as (select * from tb_name),tmp2 as (select * from tb_name2),tmp3 as (select * from tb_name3),其實就是把一大堆重復用到的sql語句放在with as里面,取一個別名,后面的查詢就可以用它,這樣對于大批量的sql語句起到一個優化的作用,而且清楚明了。
舉例:1with e as (select * from * e where *=7499)select * from e;2withs1 as (select rownum c1 from dual connect by rownum <= 10),s2 as (select rownum c2 from dual connect by rownum <= 10)select a.c1, b.c2 from s1 a, s2 b where。;。
oracle中with check option是什么意思
這個主要是在創建視圖的時候使用,用來保證數據的完整性。
它的意思是:強制針對視圖執行的所有數據修改語句都必須符合在定義視圖時的SELECT語句中設置的條件。通過視圖修改行時,WITH CHECK OPTION 可確保提交修改后,仍可通過視圖看到數據。如果在定義視圖的語句中的任何位置使用 TOP,則不能指定 CHECK OPTION。
如果指定了WITH CHECK OPTION,也不能依據視圖來驗證任何直接對視圖的基礎表執行的更新。
Oracle sql語句加上with rollup 就報錯,個人覺得我寫的語法沒錯-百度知
你第一個截圖那張,with用的是sqlserver的語法,你用到oracle里當然不行 oralce里使用是這樣的 select *er,*alno,sum(*ty)from tb a group by rollup(*er,*alno) 后一個cmd下的語法,也是sqlserver或者access,或者mysql,總之不是oracle里的語法 oracle下這樣 insert into tb select 'Canon','001',500 from dualunion allselect 'Canon','001',200 from dualunion allselect 'Canon','002',100 from dualunion allselect 'Canon','002',300 from dualunion allselect 'Sony','001',200 from dualunion allselect 'IBM','002',100 from dualunion allselect 'IBM','001',600 from dualunion allselect 'IBM','002',200 from dual;。
在oracle中sql語句和hsql語句的區別是什么
oracle只有sql語句吧。HSQL不是語句,是一個開源的java數據庫項目(我大學數據庫課就是用的這個玩意),HSQL用的語句也是叫SQL。
sql指的是結構化查詢語言,是數據庫的查詢、編程語言。各種數據庫用的語言都叫做sql,只不過細節上是有點不同的,但是一般都遵循sql語句的國際標準。SQL標準是由國際標準組織規定的,現在應該到SQL:2006標準了,數據庫廠商不一定會完全支持這些標準,但是基本的東西肯定都支持,只不過部分細節的寫法和實現會有差別。
Oracle9i數據庫WITH查詢語法小議是什么
Oracle9i新增了WITH語法功能,可以將查詢中的子查詢命名,放到SELECT語句的最前面。
下面看一個簡單的例子: SQL> WITH2 SEG AS (SELECT SEGMENT_NAME, SUM(BYTES)/1024 K FROM USER_SEGMENTS GROUP BY SEGMENT_NAME),3 OBJ AS (SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS)4 SELECT O。 OBJECT_NAME, OBJECT_TYPE, NVL(S。
K, 0) SIZE_K5 FROM OBJ O, SEG S6 WHERE O。OBJECT_NAME = S。
SEGMENT_NAME (+)7 ;OBJECT_NAME OBJECT_TYPE SIZE_KDAIJC_TEST TABLE 128P_TEST PROCEDURE 0IND_DAIJC_TEST_C1 INDEX 128通過WITH語句定義了兩個子查詢SEG和OBJ,在隨后的SELECT語句中可以直接對預定義的子查詢進行查詢。 從上面的例子也可以看出,使用WITH語句,將一個包含聚集、外連接等操作SQL清晰的展現出來。
WITH定義的子查詢不僅可以使查詢語句更加簡單、清晰,而且WITH定義的子查詢還具有在SELECT語句的任意層均可見的特點。 即使是在WITH的定義層中,后定義的子查詢都可以使用前面已經定義好的子查詢: SQL> WITH2 Q1 AS (SELECT 3 + 5 S FROM DUAL),3 Q2 AS (SELECT 3 * 5 M FROM DUAL),4 Q3 AS (SELECT S, M, S + M, S * M FROM Q1, Q2)5 SELECT * FROM Q3;S M S+M S*M8 15 23 120利用WITH定義查詢中出現多次的子查詢還能帶來性能提示。
Oracle會對WITH進行性能優化,當需要多次訪問WITH定義的子查詢時,Oracle會將子查詢的結果放到一個臨時表中,避免同樣的子查詢多次執行,從而有效的減少了查詢的IO數量。 看一個簡單的例子,首先構造一張大表,現在要取出大表中ID最小、ID最大以及ID等于平均值的記錄,看看普通寫法和WITH語句的區別: SQL> CREATE TABLE T_WITH AS SELECT ROWNUM ID, A。
* FROM DBA_SOURCE A WHERE ROWNUM SET TIMING ON SQL> SET AUTOT ON SQL> SELECT ID, NAME FROM T_WITH2 WHERE ID IN 3 (4 SELECT MAX(ID) FROM T_WITH 5 UNION ALL6 SELECT MIN(ID) FROM T_WITH7 UNION ALL8 SELECT TRUNC(AVG(ID)) FROM T_WITH9 );ID NAME1 STANDARD50000 DBMS_BACKUP_RESTORE100000 INITJVMAUX已用時間: 00: 00: 00。 09執行計劃Plan hash value: 647530712-----------------------------------------------------------| Id | Operation | Name | Rows | Bytes |-----------------------------------------------------------| 0 | SELECT STATEMENT | | 3 | 129 ||* 1 | HASH JOIN | | 3 | 129 || 2 | VIEW | VW_NSO_1 | 3 | 39 || 3 | HASH UNIQUE | | 3 | 39 || 4 | UNION-ALL | | | || 5 | SORT AGGREGATE | | 1 | 13 || 6 | TABLE ACCESS FULL| T_WITH | 112K| 1429K|| 7 | SORT AGGREGATE | | 1 | 13 || 8 | TABLE ACCESS FULL| T_WITH | 112K| 1429K|| 9 | SORT AGGREGATE | | 1 | 13 || 10 | TABLE ACCESS FULL| T_WITH | 112K| 1429K|| 11 | TABLE ACCESS FULL | T_WITH | 112K| 3299K|-----------------------------------------------------------Predicate Information (identified by operation id):---------------------------------------------------1 - access("ID"="$nso_col_1")Note------ dynamic sampling used for this statement統計信息----------------------------------------------------------0 recursive calls0 db block gets5529 consistent gets0 physical reads0 redo size543 bytes sent via SQL*Net to client385 bytes received via SQL*Net from client2 SQL*Net roundtrips to/from client0 sorts (memory)0 sorts (disk)3 rows processed為了避免第一次執行時物理讀的影響,查詢結果選取了SQL的第三次運行,物理讀為0時的統計信息。
。
轉載請注明出處華閱文章網 » oraclewith語句