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

Posted

技术标签:

【中文标题】Oracle 中的 OUTER APPLY 有啥替代方案吗?【英文标题】:Is there any alternative for OUTER APPLY in Oracle?Oracle 中的 OUTER APPLY 有什么替代方案吗? 【发布时间】:2015-07-07 20:45:27 【问题描述】:

在以下示例中,我将 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 的替代方案?

【问题讨论】:

你们在tbc有top或者ordering吗?我们可以看到整个 tbc 吗? 您使用的是什么版本的 Oracle?如果您使用的是 12.1,Oracle 确实支持 outer apply。否则,您必须至少稍微更改查询结构以删除outer apply。在这种情况下,您不能只做一个left outer join,其中tbA.id = tbB.id 是全部或部分连接条件吗? dbaora.com/… 很遗憾,我无法更改查询的结构,因为它是 Microsoft Entity Framework 从 LINQ 查询生成的动态查询。我需要找到另一种方式...:/ EF 在 SQL 方面确实存在限制。这就是为什么,如果您需要执行高度自定义的查询或存储过程等,您不使用 EF 【参考方案1】:

SQL Servers outer apply 类似于 SQL 标准 lateral。 Oracle 从 12c(*) 开始支持 lateral

您可以在标准 SQL 中使用 left join lateral 而不是 outer apply,如果要省略 ON/USING 子句,则使用 cross join lateral

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

【讨论】:

好答案。我认为,我们在这里浪费时间,因为查询是由实体框架生成的,而 Raffael 将无能为力 是的,很好的答案! @TS是正确的。在实体框架生成查询之后并将其发送到 DBMS 之前,我可以稍微更改查询。我可以通过使用 DbInterceptor 来做到这一点。可以替换一两个关键字,但我无法使用拦截器更改复杂查询的结构。各位,在这里非常感谢你们的帮助! 因此,就我而言,我不需要在 Oracle 12c 中使用“横向”。因为Oracle 12c 支持“外部应用”。如果我使用 Oracle 12c,我不需要任何更改或 SQL 拦截。【参考方案2】:

根据cmets编辑:

在 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
 ...

【讨论】:

在这种情况下,结构被修改了。不幸的是,我的要求是不改变结构。 @RaffaelBecharaRameh 修改了什么?您可以编写复杂的联接或内联查询,并将其结果联接到另一个复杂结果。我只是看不到你的情况,为什么不使用outer join 结构是什么意思? @RaffaelBecharaRameh 老实说,很难猜出您需要什么。您的问题是,“替代外部应用”,现在您说,您正在寻找 “keyword”。但问题是,Join 既是“替代品”又是“关键字”。存在执行差异。 外部应用是相关执行,可能需要也可能不需要更长的时间,等等。然后,你说,EF会生成这个,那么,如果你无法控制它,我们怎么能帮助它呢?如果要保证执行,请为 Oracle 创建存储过程,为 SQL 服务器创建一个。我们想帮助你,但你的问题和 cmets 是矛盾的 @T.S.我感谢你给我的良好贡献。我非常感谢你!我的结论是,在 Oracle 11g 中“应用”没有直接关联。我知道加入,但它有点不同。关于 EF,如果只是一个词,我会在通过拦截器将其发送到 DBMS 之前替换它。我会考虑转移到12c。支持“申请”。

以上是关于Oracle 中的 OUTER APPLY 有啥替代方案吗?的主要内容,如果未能解决你的问题,请参考以下文章

CROSS APPLY和 OUTER APPLY 区别详解

CROSS APPLY和 OUTER APPLY 区别详解

CROSS APPLY和 OUTER APPLY 区别详解

CROSS APPLY 和 OUTER APPLY 区别

cross apply 和 outer apply

SQL 关于apply的两种形式cross apply 和 outer apply