ORACLE WITH AS 用法

ORACLE WITH AS 用法分类:Oracle 2009-12-02 13:51 950人阅读评论(0) 收藏举报原文传送门:/wh62592855/archive/2009/11/06/4776631.aspx记得以前在论坛里看到inthirties用到过WITH AS这个字眼,当时没特别在意。

今天在一个帖子里又看到有人用这个,所以就去网上搜了搜相关内容,自己小试了一把,写下来,方便以后忘了的话学习。

=================================================================== ================先举个例子吧:有两张表,分别为A、B,求得一个字段的值先在表A中寻找,如果A表中存在数据,则输出A表的值;如果A表中不存在,则在B表中寻找,若B表中有相应记录,则输出B表的值;如果B表中也不存在,则输出"no records”字符串。

view plaincopy to clipboardprint?1. w ith2. s ql1 as (select to_char(a) s_name from test_tempa),3. s ql2 as (select to_char(b) s_name from test_tempb where not exists (select s_name from sql1 where rownum=1))4. s elect * from sql15. u nion all6. s elect * from sql27. u nion all8. s elect 'no records' from dual9. where not exists (select s_name from sql1 where rownum=1)10. and not exists (select s_name from sql2 where rownum=1);The SQL-99 “WITH clause” is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the “WITH clause” to start our SQL query, defining the aggregations, which can then be named in the main query as if they were “real” tables:WITHsubquery_nameAS(the aggregation SQL statement)SELECT(query naming subquery_name);Retuning to our oversimplified example, let’s replace the temporary tables with the SQL “WITH clause”:WITHsum_sales ASselect /*+ materialize */sum(quantity) all_sales from storesnumber_stores ASselect /*+ materialize */count(*) nbr_stores from storessales_by_store ASselect /*+ materialize */store_name, sum(quantity) store_sales fromstore natural join salesSELECTstore_nameFROMstore,sum_sales,number_stores,sales_by_storewherestore_sales > (all_sales / nbr_stores);Note the use of the Oracle undocumented “materialize” hint in the “WITH clause”. The Oracle materialize hint is used to ensure that the Oracle cost-based optimizer materializes the tempor ary tables that are created inside the “WITH” clause. This is not necessary in Oracle10g, but it helps ensure that the tables are only created one time.It should be noted that the “WITH clause” does not yet fully-functional within Oracle SQL and it does n ot yet support the use of “WITH clause” replacement for “CONNECT BY” when performing recursive queries.To see how the “WITH clause” is used in ANSI SQL-99 syntax, here is an excerpt from Jonathan Gennick’s great work “Understanding the WITH Clause” showin g the use of the SQL-99 “WITH clause” to traverse a recursive bill-of-materials hierarchyThe SQL-99 “WITH clause” is very confusing at first because the SQL statement does not begin with the word SELECT. Instead, we use the “WITH clause” to start our SQL query, defining the aggregations, which can then be named in the main query as if they were “real” tables:WITHsubquery_nameAS(the aggregation SQL statement)SELECT(query naming subquery_name);Retuning to our oversimplified example, let’s replace t he temporary tables with the SQL “WITH” clause”:=================================================================== ==============下面自己小试一把,当然,一点都不复杂,很简单很简单的例子,呵呵。

view plaincopy to clipboardprint?1. S QL> create table t2(id int);2.3. T able created.4.5. S QL> create table t3(id int);6.7. T able created.8.9. S QL> insert into t2 values(1);10.11. 1 row created.12.13. SQL> insert into t2 values(2);14.15. 1 row created.16.17. SQL> insert into t3 values(3);18.19. 1 row created.20.21. SQL> commit;22.23. Commit complete.24.25. SQL> select * from t2;26.27. ID28. ----------29. 130. 231.32. SQL> select * from t3;33.34. ID35. ----------36. 337. SQL> with38. 2 sql1 as (select * from t2),39. 3 sql2 as (select * from t3)40. 4 select * from t241. 5 union42. 6 select * from t3;43. sql2 as (select * from t3)44. *45. ERROR at line 3:46. ORA-32035: unreferenced query name defined in WITH clause47.48. --从这里可以看到,你定义了sql1和sql2,就得用它们哦,不然会报错的。

49.50. SQL> with51. 2 sql1 as (select * from t2),52. 3 sql2 as (select * from t3)53. 4 select * from sql154. 5 union55. 6 select * from sql2;56.57. ID58. ----------59. 160. 261. 362.63. --下面加个WHERE条件试试64.65. SQL> with66. 2 sql1 as (select * from t2),67. 3 sql2 as (select * from t3)68. 4 select * from sql169. 5 union70. 6 select * from sql271. 7 where id in(2,3);72.73. ID74. ----------75. 176. 277. 378.79. --奇怪?为什么加了WHERE条件还是输出ID=1的记录了,继续往下看:80.81. SQL> with82. 2 sql1 as (select * from t2),83. 3 sql2 as (select * from t3)84. 4 select * from sql185. 5 where id=386. 6 union87. 7 select * from sql288. 8 where id=3;89.90. ID91. ----------92. 393.94. --可以看到,每个条件是要针对每个SELECT语句的。

合集下载

oracle中with递归的用法

oracle中with递归的用法

oracle中with递归的用法在Oracle数据库中,可以使用"WITH"子句进行递归查询。

递归查询是一种特殊的查询模式,它允许我们在查询中引用查询结果本身,从而实现对自身进行迭代操作的功能。

"WITH"子句也被称为"公共表表达式(CTE)",它可以像创建临时表一样将一个查询结果作为虚拟表存储在内存中。

在递归查询中,我们可以使用"WITH RECURSIVE"子句来标识递归关系和终止条件。

让我们来看一个简单的示例来理解"WITH RECURSIVE"的用法。

假设我们有一个名为"Employees"的表,其中包含员工的ID和上级ID。

我们想要找到每个员工的所有下属。

首先,我们需要定义递归查询的初始条件,即根节点。

我们可以使用"WITH"子句来定义一个初始查询:```WITH RECURSIVE Subordinates AS (SELECT ID, NameFROM EmployeesWHERE ID = 1 --根节点的IDUNION ALLSELECT E.ID, FROM Employees EINNER JOIN Subordinates S ON E.Supervisor_ID = S.ID)```在上面的例子中,我们选择ID为1的员工作为根节点,并将其放入一个名为"Subordinates"的递归查询中。

然后,我们使用UNION ALL将根节点的下属与子查询的结果连接起来,形成一个递归关系。

接下来,我们需要选择递归查询的结果。

在这个例子中,我们只需选择最终结果,即所有下属的姓名:```SELECT NameFROM Subordinates;```这样,我们就得到了根节点下的所有员工的下属姓名。

需要注意的是,在递归查询中,我们必须保证递归路径是有限的,并且存在终止条件,否则查询将无限循环。

sql语句中with用法

sql语句中with用法

sql语句中with⽤法
转载地址:
1、关键字作⽤:
WITH AS短语,也叫做⼦查询部分,定义⼀个SQL⽚断后,该SQL⽚断可以被整个SQL语句所⽤到。

有的时候,with as是为了提⾼SQL语句的可读性,减少嵌套冗余。

2、关键字概述:
1、在标准的数据库中,如hive,Oracle,DB2,SQL SERVER,PostgreSQL都是⽀持WITH AS 语句进⾏递归查询。

只有MySQL是不⽀持的。

⽐如SQL:
with as (
select * from user ) A
select * from student customer where erid = er.id
这个sql语句的意思是:先执⾏select * from user把结果放到⼀个临时表A中,作为全局使⽤。

with as的⽤法可以通俗点讲是,讲需要频繁执⾏的slq⽚段加个别名放到全局中,后⾯直接调⽤就可以,这样减少调⽤次数,优化执⾏效率。

3. with as的优点
增加了sql的易读性,如果构造了多个⼦查询,结构会更清晰;
更重要的是:“⼀次分析,多次使⽤”,这也是为什么会提供性能的地⽅,达到了“少读”的⽬标
“⼀次分析,多次使⽤”,这也是为什么会提供性能的地⽅,达到了“少读”的⽬标
4.⾃⼰练习⼀道题⽬
with ZQ1 as
(select distinct(sno),sname,ssex,sclass from student),
ZQ2 as
(select sno,cno,degree from score )
select * from ZQ1,ZQ2
where ZQ1.sno =ZQ2.sno。

oracle sql with 写法

oracle sql with 写法

oracle sql with 写法Oracle SQL是一种强大的数据库查询语言,它可以帮助用户快速高效地查询和管理数据库中的数据。

在使用Oracle SQL时,有一些常用的写法可以帮助用户更好地利用其功能,提高查询效率。

1. 使用WITH子句WITH子句是Oracle SQL中的一个强大的工具,它可以帮助用户创建临时表格或视图,以便在查询中使用。

使用WITH子句可以使查询更加简洁明了,同时也可以提高查询效率。

例如,以下是一个使用WITH子句的查询示例:WITH temp_table AS (SELECT column1, column2FROM table1WHERE column3 = 'value')SELECT *FROM temp_tableWHERE column2 > 10;在这个示例中,使用WITH子句创建了一个名为temp_table的临时表格,其中包含了从table1表格中选择column1和column2列,并且column3列的值等于'value'的所有行。

然后,在查询中使用了这个临时表格,筛选出了column2列的值大于10的所有行。

2. 使用子查询除了WITH子句之外,Oracle SQL中还有一种常用的查询方式是子查询。

子查询可以帮助用户在查询中嵌套使用多个SELECT语句,以便更好地筛选和管理数据。

例如,以下是一个使用子查询的查询示例:SELECT *FROM table1WHERE column1 IN (SELECT column1FROM table2WHERE column2 = 'value');在这个示例中,使用了一个子查询来筛选出table2表格中column2列的值等于'value'的所有行,并且返回这些行中的column1列的值。

然后,在主查询中使用了IN运算符,筛选出table1表格中column1列的值在子查询中返回的值集合中的所有行。

with as ( select 语法

with as ( select 语法

with as (select 语法是一种在SQL中常用的语法结构,它用于创建临时表并在查询中使用。

本文将介绍with as (select语法的基本用法和特点。

一、基本用法1.1 基本语法with子句的基本语法如下:```with 临时表名 as (select 列表达式from 表名where 条件)select *from 临时表名;```在上面的语法中,with子句用于创建一个临时表,并为其指定一个名称。

临时表是由select语句生成的结果集,可以在后续的查询中使用。

1.2 示例下面是一个简单的示例,演示了with as语法的基本用法:```with dept_sales as (select department_id, sum(sales) as total_salesfrom salesgroup by department_id)select *from dept_sales;```在这个示例中,我们首先使用select语句计算了每个部门的销售总额,并将结果存储在了名为dept_sales的临时表中。

我们通过select * from dept_sales语句查看了这个临时表的内容。

二、特点2.1 代码复用with as语法可以在查询中定义一个临时表,避免重复书写相同的逻辑。

这样可以使得SQL代码更加简洁和易读。

2.2 查询优化数据库系统可以对with as子句中定义的临时表执行优化,并且在后续的查询中重复使用它,提升查询性能。

2.3 递归查询with as语法还可以用于执行递归查询,这在处理层次数据结构时非常有用。

三、总结本文介绍了with as (select语法的基本用法和特点。

它能够帮助我们在SQL查询中创建临时表,提高代码的可读性和性能。

希望本文能够对读者在使用with as (select语法时有所帮助。

with as (select 语法是一种在SQL中常用的语法结构,它用于创建临时表并在查询中使用。

aswith的用法总结

aswith的用法总结

aswith的用法总结一、Aswith的定义与用途Aswith是一个在计算机科学领域中常见的术语,它指的是在编程中使用的一种控制结构或函数。

通过使用aswith,程序可以根据特定条件来执行不同的代码块或采取不同的操作,从而实现更灵活和动态的编程。

二、Aswith基本语法和示例代码以下是aswith控制结构的基本语法:```aswith (表达式) {// 代码块1} or (表达式2) {// 代码块2} or (表达式3) {// 代码块3}```在上述代码中,每个表达式都会被依次检查。

如果某个表达式为真,则相应的代码块将被执行。

如果没有任何一个表达式为真,则可以选择执行默认代码块或者不执行任何操作。

下面是一个使用aswith的示例代码:假设我们要根据某个变量x的值来判断并执行不同操作。

```pythonaswith (x) {case 1 : {print("x等于1");}case 2 : {print("x等于2");}case 3 : {print("x等于3");}default : {print("未知情况");}}```在这个例子中,如果变量x等于1,那么" x等于1"会被打印出来;如果x等于2,那么" x等于2"会被打印出来;如果x等于3,那么" x等于3"会被打印出来。

如果x的值不符合任何一个case,那么将执行default代码块中的语句。

三、Aswith与其他控制结构的比较aswith是一种更加灵活和动态的控制结构。

与传统的if-else或switch-case语句相比,aswith提供了更多选项,并且允许多个表达式进行判断。

这意味着我们可以根据不同的条件来执行不同的代码块,从而实现更加复杂和精细化的编程逻辑。

与if-else语句相比,aswith语句通常更加简洁,并且可以对多个条件进行检查,减少了重复代码的编写。

oracle不支持使用with字句,Oracle版WITH语句的使用

oracle不支持使用with字句,Oracle版WITH语句的使用

oracle不⽀持使⽤with字句,Oracle版WITH语句的使⽤说起WITH 语句,除了那些第⼀次听说WITH 语句的⼈,⼤部分⼈都觉得它是⽤来做递归查询的。

其实那只是它的⼀个⽤途⽽已,它的本名正如我们标题写的那样,叫做:公共表表达式(Common Table Expression),从字⾯理解,⼤家觉得它是⽤来⼲嘛的呢?其实,它是⽤来定义临时集合的。

Sql代码WITH TEMP(ID,USER) AS(SELECT ‘01’,’SAM’ FROM DUALUNION ALLSELECT ‘02’,’MIKE’ FROM DUALUNION ALLSELECT ‘03’,’TOM’ FROM DUALUNION ALLSELECT ‘04’,’JANE’ FROM DUAL)SELECT * FROM TEMP;WITH TEMP(ID,USER) AS(SELECT ‘01’,’SAM’ FROM DUALUNION ALLSELECT ‘02’,’MIKE’ FROM DUALUNION ALLSELECT ‘03’,’TOM’ FROM DUALUNION ALLSELECT ‘04’,’JANE’ FROM DUAL)SELECT * FROM TEMP;WITH可以定义多个结果集,中间⽤逗号分隔。

(这种写法更加符合普通思维的逻辑,写出来的代码更加容易理解)WITH 语句是为复杂的查询为设计的,的确是这样的,下⾯我们举个复杂的例⼦,想提⾼技术的朋友可千万不能错过。

考虑下⾯的情况:Sql代码CREATE TABLE USER(NAME VARCHAR(20) NOT NULL,--姓名DEGREE INTEGER NOT NULL,--学历(1、专科2、本科3、硕⼠4、博⼠)STARTWORKDATE date NOT NULL,--⼊职时间SALARY1 FLOAT NOT NULL,--基本⼯资SALARY2 FLOAT NOT NULL--奖⾦);CREATE TABLE USER(NAME VARCHAR(20) NOT NULL,--姓名DEGREE INTEGER NOT NULL,--学历(1、专科2、本科3、硕⼠4、博⼠)STARTWORKDATE date NOT NULL,--⼊职时间SALARY1 FLOAT NOT NULL,--基本⼯资SALARY2 FLOAT NOT NULL--奖⾦);假设现在让你查询⼀下那些1、学历是硕⼠或博⼠2、学历相同,⼊职年份也相同,但是⼯资(基本⼯资+奖⾦)却⽐相同条件员⼯的平均⼯资低的员⼯。

oracle中with as()用法

with as语句是Oracle数据库中的一种常用查询方式,它可以在查询语句中定义一个临时表,并在查询过程中多次引用该临时表,从而简化复杂查询的编写。

本文将从with as语句的基本语法、用法和示例进行详细介绍,以帮助读者更好地理解和应用这一功能。

一、基本语法with as语句的基本语法如下:```WITH表名1 AS (子查询1),表名2 AS (子查询2),...SELECT列名1, 列名2, ...FROM表名1, 表名2, ...WHERE条件表达式;```其中,with as语句由关键字WITH引导,后面跟随一个或多个子句,每个子句由表名和与之对应的子查询组成。

with as语句的子查询可以包含常规的SELECT语句、JOIN语句和聚合函数等,用于生成临时表。

二、用法with as语句的主要用途有以下几个方面:1. 简化复杂查询:通过将复杂的查询逻辑分解为多个子查询,并利用with as语句定义临时表,可以使查询语句更加清晰易懂,减少代码冗余和错误。

2. 提高查询性能:由于with as语句中定义的临时表可以被多次引用,数据库引擎可以将这些临时表的计算结果缓存起来,从而降低查询的计算量,提高查询的性能。

3. 支持递归查询:在with as语句中可以定义递归查询,即一个子查询引用了它自身的结果,这种做法在处理树形结构或图形结构的数据时非常有用。

三、示例以下通过一个具体的示例来演示with as语句的用法。

假设有如下的员工表employee和部门表department:```employee表:员工编号尊称部门编号1 张三 1012 李四 1023 王五 101department表:部门编号部门名称101 技术部102 销售部```现在需要统计每个部门的员工总数和平均工资,并按照平均工资的降序排列。

可以使用with as语句来实现该查询:```WITH emp_dept AS (SELECTe.部门编号,COUNT(*) AS 员工总数,AVG(e.工资) AS 平均工资FROMemployee eGROUP BYe.部门编号)SELECTd.部门名称,ed.员工总数,ed.平均工资FROMdepartment dJOIN emp_dept ed ON d.部门编号 = ed.部门编号ORDER BYed.平均工资 DESC;```在上述示例中,首先利用with as语句定义了一个名为emp_dept的临时表,该临时表对employee表进行了分组聚合计算,得到了每个部门的员工总数和平均工资。

with as 用法 oracle

with as 用法 oracle在Oracle数据库中,WITHAS是一种用于临时创建一个虚拟表并对其进行处理的方法,常用于复杂查询和子查询中。

本文将介绍WITHAS的用法和注意事项。

一、WITHAS语法WITHAS语法的一般格式如下:WITH虚拟表名(列名1数据类型,列名2数据类型,...)AS(子查询或其他语句)SELECT列名1,列名2,...FROM虚拟表名WHERE条件其中,虚拟表名是自定义的名称,列名和数据类型定义了虚拟表中的列,子查询或其他语句定义了虚拟表的内容,SELECT语句用于从虚拟表中选取数据。

二、WITHAS用法示例以下是一个使用WITHAS的示例查询:假设我们有一个员工表employees,其中包含员工姓名、部门和工资等信息。

我们想要查询每个部门的平均工资,可以使用WITHAS来创建一个虚拟表,包含每个部门的员工数量和工资总额。

WITHdepartment_totalsAS(SELECTdepartment,SUM(salary)AStotal_salaryFROMemployeesGROUPBYdepartment),avg_salaryAS(SELECTdepartment,AVG(total_salary)ASavg_salaryFROMdepartment_totalsGROUPBYdepartment)SELECT*FROMavg_salary;在上述示例中,我们首先使用子查询GROUPBYdepartment将employees表中的数据分组,并计算每个部门的总工资。

然后,我们使用WITHAS创建了两个虚拟表department_totals和avg_salary,其中department_totals包含每个部门的总工资,avg_salary包含每个部门的平均工资。

最后,我们从avg_salary中选择了所有列。

三、注意事项使用WITHAS时需要注意以下几点:1.虚拟表名必须是唯一的,不能与表名或别名冲突。

oracle存储过程中的with用法

一、概述Oracle数据库提供了存储过程来帮助用户封装一系列SQL语句,以便于简化数据库操作和提高性能。

在存储过程中,常常会使用到WITH 子句来创建临时的查询结果集,以便在存储过程的后续语句中使用。

本文将重点介绍在Oracle存储过程中的WITH用法及注意事项。

二、WITH子句概述1、WITH子句是一种通用表表达式(CTE,Common Table Expression),用于创建临时的命名查询结果集。

WITH子句通常由关键字WITH和一个或多个子查询组成,可以在后续的SQL语句中像使用表一样引用这些临时结果集。

2、在存储过程中使用WITH子句能够提高可读性和维护性,同时还可以优化查询性能。

三、在Oracle存储过程中使用WITH子句的示例在存储过程中使用WITH子句的一般语法如下:```sqlCREATE OR REPLACE PROCEDURE procedure_nameASBEGINWITH temp_table (column1, column2, ...)AS(SELECT column1, column2, ...FROM table_nameWHERE ...)-- 后续的SQL语句可以引用temp_tableEND;```下面是一个具体的示例,假设我们有一个存储过程,需要根据员工的工资水平来进行统计和分析。

```sqlCREATE OR REPLACE PROCEDURE calculate_salary_statistics ASBEGINWITH high_salary_employees (employee_id, employee_name, salary)AS(SELECT employee_id, employee_name, salaryFROM employeesWHERE salary > xxx)SELECT COUNT(*)INTO high_salary_employee_countFROM high_salary_employees;-- 后续可以继续使用high_salary_employees来编写其他逻辑END;```四、在存储过程中使用WITH子句的注意事项1、WITH子句内的查询结果集只在当前的SQL语句中有效,后续的SQL语句需要继续引用它的话,必须在相同的语句块中。

oracle数据库的with as用法-概述说明以及解释

oracle数据库的with as用法-概述说明以及解释1.引言1.1 概述概述Oracle数据库是一种关系型数据库管理系统,具有高性能、可靠性和安全性等优势。

在Oracle数据库中,WITH AS子句是一种强大的查询工具,它可以简化复杂查询的编写过程,并提高查询的可读性和可维护性。

通过使用WITH AS子句,我们可以创建临时表达式或视图,然后在主查询中引用这些临时结果。

在本文中,我们将重点介绍Oracle数据库中WITH AS子句的用法。

首先,我们将了解WITH AS的基本概念和作用,然后探讨它的语法和用法。

最后,我们将讨论WITH AS的优点和应用场景,并进行总结。

通过本文的阅读,读者将能够更好地理解和应用Oracle数据库中的WITH AS子句,从而提高查询的效率和灵活性。

1.2文章结构【1.2 文章结构】本文将按照以下结构来介绍和讲解Oracle 数据库中的WITH AS 用法。

首先,在引言部分将对本文进行概述,然后介绍文章的目的。

接着,在正文部分,我们会详细讲解WITH AS 的概念和作用,并提供其语法和用法的实际示例。

最后,在结论部分,我们将重点强调WITH AS 的优点和应用场景,并对全文进行总结。

通过这样的结构安排,读者将能够逐步了解并掌握WITH AS 在Oracle 数据库中的使用方法和实际应用价值。

1.3 目的本文的目的是介绍和探讨Oracle数据库中的WITH AS用法。

通过深入理解WITH AS的概念、语法和用法,读者能够更加全面地了解该特性的作用和优势,并能够在实际的数据库开发过程中灵活地运用它。

在实际的数据库操作中,我们经常需要处理复杂的查询和数据操作。

这些操作可能需要使用到多个子查询或临时表,而WITH AS就是为了简化这种复杂查询和操作而设计的。

使用WITH AS可以将一个或多个子查询定义为一个临时的命名查询块,然后在主查询中使用这个命名查询块。

它的优势在于可以提高查询的可读性和可维护性,减少了重复的代码,同时也可以提升查询性能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档