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而言,并且根本没有实现一个不支持的功能.
这并不是直接回答你的问题,但也许你可以考虑一下:
SQL Server 似乎在有意义的情况下限制了 SQL 的语义(不一定是语法)。例如,ORDER BY如果您没有同时指定子句,则不能使用带有TOP n子句的子查询。这是有道理的,因为除非有限制,否则有序子查询是没有意义的。其他 RDBMS 允许这种毫无意义的情况。
在您的情况下(这只是猜测),在子查询中使用 CTE 的意义有限,因为您可以以在最顶层声明 CTE 的方式重写整个查询。唯一的区别是每个声明的范围以及可能的可读性。
另一方面,CTE 允许递归查询,当在子查询中声明 CTE 时,这可能很难应用......
由于您需要实现与数据库无关的 SQL,因此我建议您暂时不要大量使用 CTE。如果 CTE 很简单,您始终可以将它们重写为简单视图......
| 归档时间: |
|
| 查看次数: |
11081 次 |
| 最近记录: |