• Oracle With As 查询


    WITH AS

    WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。

    特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用WITH AS短语,则只要执行一遍即可。如果WITH AS短语所定义的表名被调用两次以上,则优化器会自动将WITH AS短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将WITH AS短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。

    with

        sql1 as (select to_char(a) s_name from test_tempa),

        sql2 as (select to_char(b) s_name from test_tempb where not exists (select s_name from sql1 where rownum=1))

    select * from sql1

    union all

    select * from sql2

    union all

    select 'no records' from dual

           where not exists (select s_name from sql1 where rownum=1)

           and not exists (select s_name from sql2 where rownum=1);

    另外,WMSYS.WM_CONCAT 这个函数可以将查询结果某列多行拼接成一个结果,非常实用。

    With语句的语法(AS后面的括号是不可以空缺的)

    WITH <alias_name> AS (subquery_sql_statement)

    SELECT <column_name_list> FROM <alias>;

    注意,定义了WITH语句必须在后边的查询中使用,否则提示错误。

    WITH子句相关总结:

    1、在同级select前有多个查询定义的时候,第1个用with,后面的不用with,并且用逗号隔开。

    2、最后一个with 子句与下面的查询之间不能有逗号,只通过右括号分割,with 子句的查询必须用括号括起来

    3、如果定义了with子句,而在查询中不使用,那么会报ora-32035 错误:未引用在with子句中定义的查询名。(至少一个with查询的name未被引用,解决方法是移除未被引用的with查询),注意:只要后面有引用的就可以,不一定非要在主查询中引用,比如后面的with查询也引用了,也是可以的。

    4、前面的with子句定义的查询在后面的with子句中可以使用。但是一个with子句内部不能嵌套with子句。

    5、with查询的结果列有别名,引用的时候必须使用别名或*。

    WITH语句的优点:

    (1). SQL可读性增强。比如对于特定with子查询取个有意义的名字等。

    (2)、with子查询只执行一次,将结果存储在用户临时表空间中,可以引用多次,增强性能。

    举例:在进行导入EXCEL的过程中,有时候,需要将数据存储在临时表中,当下一次在进行导入的时候,进行清除临时表的数据,但是这时候,有时候发生并发问题的话,两个用户可能会分别操作对方的数据,所以,可能造成混乱,但是可以使用WITH函数和UNION语句拼接一个SQL语句,存储在SESSION中,当需要导出错误信息的时候,可以使用该语句构造数据。

  • 相关阅读:
    在mysql中,如何改变列声明.
    Field 'id' doesn't have a default value 原因
    secureCRT不能输入
    让工程科技造福人类、创造未来—在2014年国际工程科技大会上的主旨演讲
    jsp如何判断mysql数据库中是否已经存在添加的某条记录的方法
    mysql alter修改字段的长度 类型sql语句
    项目相关
    求职信模板
    PowerDesigner Constraint name uniqueness 错误
    PowerDesigner 创建表格及导出SQL语句
  • 原文地址:https://www.cnblogs.com/shengs/p/5954837.html
Copyright © 2020-2023  润新知