子查询中的公用表表达式

Kap*_*pil 7 oracle db2 postgresql sybase common-table-expression

我请求帮助理解来自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>>
Run Code Online (Sandbox Code Playgroud)

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

Luk*_*der 3

这并不是直接回答你的问题,但也许你可以考虑一下:

SQL Server 似乎在有意义的情况下限制了 SQL 的语义(不一定是语法)。例如,ORDER BY如果您没有同时指定子句,则不能使用带有TOP n子句的子查询。这是有道理的,因为除非有限制,否则有序子查询是没有意义的。其他 RDBMS 允许这种毫无意义的情况。

在您的情况下(这只是猜测),在子查询中使用 CTE 的意义有限,因为您可以以在最顶层声明 CTE 的方式重写整个查询。唯一的区别是每个声明的范围以及可能的可读性。

另一方面,CTE 允许递归查询,当在子查询中声明 CTE 时,这可能很难应用......

由于您需要实现与数据库无关的 SQL,因此我建议您暂时不要大量使用 CTE。如果 CTE 很简单,您始终可以将它们重写为简单视图......