oracle – 子查询中的公用表表达式

发布时间:2020-06-30 发布网站:脚本之家
价值2580元廖雪峰前端视频终终终于免费啦!
脚本之家收集整理的这篇文章主要介绍了oracle – 子查询中的公用表表达式脚本之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我请求帮助理解来自Oracle,DB2,Sybase的所有RDBMS在子查询中支持公共表表达式(CTE).我知道PostgreSQL会这样做,而MS SQL Server却没有.
SELECT a.*,b.* 
 FROM (WHERE aa as (
          <<select_query>),SELECT * 
            FROM aa
           WHERE <<criteria>>
    ) as a
    LEFT JOIN (
        WITH bb as (
            <<select_query>
        ),select * from bb inner join tbl_c on <<innerjoin>> where <<criteria>>
    ) as b
    on <<join_expr>>

我无法在子查询之外定义with子句 – 两个查询都是动态生成的w.r.t.列,标准,安全性等
此外,上述查询本身可以在另一个查询中用作子查询.
总之,原理是动态生成的视图,以后可以重用.一些查询也可能将多达10-12个这样的动态视图合并在一起.
问题是应用程序应该与数据库无关,至少就PG,Oracle和Oracle而言. DB2受到关注,并且一个不支持的功能根本没有实现.

是的,您可以在Oracle的子查询中使用CTE.从 Oracle 11g docs

You can specify this clause in any top-level SELECT statement and in
most types of subqueries. The query name is visible to the main query
and to all subsequent subqueries. For recursive subquery factoring,
the query name is even visible to the subquery that defines the query
name itself.

例如,这适用于Oracle:

SELECT a.*,b.*
  FROM (WITH aa AS
         (
           SELECT LEVEL l1,mod(level,5) m1 FROM dual CONNECT BY LEVEL < 50
         )
         SELECT * FROM aa WHERE m1 < 3) a LEFT JOIN
       (WITH bb AS 
         (
           SELECT LEVEL l2,5) m2 FROM dual CONNECT BY LEVEL < 50
         )
         SELECT * FROM bb WHERE m2 BETWEEN 1 AND 4) b
        ON a.l1 = b.l2;

总结

以上是脚本之家为你收集整理的oracle – 子查询中的公用表表达式全部内容,希望文章能够帮你解决oracle – 子查询中的公用表表达式所遇到的程序开发问题。

如果觉得脚本之家网站内容还不错,欢迎将脚本之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入脚本之家官方QQ群:1065694478