Oracle 9i数据库WITH查询语法小议(1)
2008-03-05 10:28
441 查看
Oracle 9i数据库WITH查询语法小议(1)
作者: yangtingkun 专家blogCNETNews.com.cn
2007-10-10 15:05:42
Oracle9i新增了WITH语法功能,可以将查询中的子查询命名,放到SELECT语句的最前面。
下面看一个简单的例子:
SQL> WITH 2 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_K 5 FROM OBJ O, SEG S 6 WHERE O.OBJECT_NAME = S.SEGMENT_NAME (+) 7 ; OBJECT_NAME OBJECT_TYPE SIZE_K DAIJC_TEST TABLE 128 P_TEST PROCEDURE 0 IND_DAIJC_TEST_C1 INDEX 128 |
WITH定义的子查询不仅可以使查询语句更加简单、清晰,而且WITH定义的子查询还具有在SELECT语句的任意层均可见的特点。
即使是在WITH的定义层中,后定义的子查询都可以使用前面已经定义好的子查询:
SQL> WITH 2 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*M 8 15 23 120 |
看一个简单的例子,首先构造一张大表,现在要取出大表中ID最小、ID最大以及ID等于平均值的记录,看看普通写法和WITH语句的区别:
SQL> CREATE TABLE T_WITH AS SELECT ROWNUM ID, A.* FROM DBA_SOURCE A WHERE ROWNUM < 100001; 表已创建。 SQL> SET TIMING ON SQL> SET AUTOT ON SQL> SELECT ID, NAME FROM T_WITH 2 WHERE ID IN 3 ( 4 SELECT MAX(ID) FROM T_WITH 5 UNION ALL 6 SELECT MIN(ID) FROM T_WITH 7 UNION ALL 8 SELECT TRUNC(AVG(ID)) FROM T_WITH 9 ); ID NAME 1 STANDARD 50000 DBMS_BACKUP_RESTORE 100000 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 calls 0 db block gets 5529 consistent gets 0 physical reads 0 redo size 543 bytes sent via SQL*Net to client 385 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 3 rows processed |
相关文章推荐
- [Oracle 9i] Subquery Factoring in 9i (用With语句做公共子查询提取)
- oracle 9i使用闪回查询恢复数据库误删问题
- oracle 9i使用闪回查询恢复数据库误删问题
- oracle 9i使用闪回查询恢复数据库误删问题
- 诸如可更新、可滚动游标及符合ANSI的CASE语句、日期一时间数据类型和连接语法之类的特性便从将在其他数据库上开发的应用程序移植到Oracle 9i中
- ORACLE分页查询SQL语法——最高效的分页
- ORACLE查询树型关系(connect by prior start with)
- Oracle 9i 数据库移动过程
- 数据库SQL中对查询结果排序排列序号编号,Oracle分析函数 rank,dense_rank,row_number使用和区别
- [DB][ORACLE]数据库活动游标数查询SQL
- oracle配置可查询的数据库
- Oracle查询数据库中含有该列名的数据库表
- Oracle 9i/10g/11g 数据库 升级路线图(upgrade roadmap)
- Oracle PL/SQL之WITH查询
- 查询和删除 oracle 数据库中 锁死的表
- 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
- Visual C# 2008+SQL Server 2005 数据库与网络开发--4.4.1 查询数据语法
- RailsCasts中文版,#15 Fun with Find Conditions 使用hash为查询条件以便生成正确语法的SQL查询
- Oracle 查询数据库中包含某一特定值的所有字段名,以及表名
- ORACLE分页查询SQL语法——最高效的分页