5

在以下示例中,我将tbA.ID传递给tbC查询。在这种情况下,我使用了 SqlServer 的 OUTER APPLY 运算符。

SELECT 
  ...
FROM (SELECT ID FROM TableA ...) tbA
OUTER APPLY (SELECT ... FROM TableB tbB WHERE tbA.ID = tbB.ID) tbC
...

在 Oracle 中,我们没有 OUTER APPLY 运算符。那么,如何在不修改查询结构的情况下将值(tbA.ID)从左侧查询传递到连接的右侧查询(tbC)?

Oracle 中的 OUTER APPLY 有什么替代方案吗?

4

2 回答 2

4

SQL Serversouter apply类似于 SQL 标准lateral。Oraclelateral从 12c(*) 开始支持。

而不是outer apply您将left join lateral在标准 SQL 中使用,或者cross join lateral如果您想省略ON/USING子句。

脚注:(*) 在版本 12c 之前,Oraclelateral在启用跟踪事件时“不受支持”。见https://jonathanlewis.wordpress.com/2011/01/31/ansi-outer/

于 2015-07-07T21:15:01.173 回答
2

根据评论编辑:

在 Oracle 12 中支持 OUTER APPLY(可能作为 SQL 标准的一部分)。由于您的 SQL 是由实体框架生成的,您需要做的就是连接到 Oracle 并查看生成的查询输出的样子。我觉得您的问题是基于恐惧,“它将如何在 Oracle 中工作?”。运行代码看看。

除此之外,Oracle 内联查询就像表一样工作。你的问题是,“有其他选择吗……?” - 是的,见下文:

SELECT 
  ...
FROM 
    (SELECT ID FROM TableA ...) tbA left join
    (SELECT ID FROM TableB ...) tbB On tbA.ID = tbB.ID
 ...
于 2015-07-07T20:52:26.150 回答