【发布时间】:2017-07-24 09:44:23
【问题描述】:
我在 Oracle-12c 中有一个架构,类似于带有 accounts、posts、comments 的典型论坛。我正在编写一个查询来获取...
- 一个用户
- 该用户的所有帖子
- 每个帖子上的 cmets
- 以及每条评论的作者。
查询如下所示:
select "accounts".*, "p".*, "c".*, "author".*
from "accounts"
cross apply (
select * from "posts"
where "posts"."author_id" = "accounts"."id"
) "p"
cross apply (
select * from "comments"
where "comments"."post_id" = "p"."id"
) "c"
left join "accounts" "author" on "author"."id" = "c"."author_id"
where "accounts"."id" = 1
此查询按预期工作。我使用 CROSS APPLY 而不是典型的 JOIN,因为稍后我将添加 OFFSET 和 FETCH 以进行分页。但是,问题是CROSS APPLY 忽略了没有 cmets 的帖子,这是我不想要的。我想保留结果中的帖子,即使它们没有 cmets。
所以我尝试将CROSS APPLY 更改为OUTER APPLY。
select "accounts".*, "p".*, "c".*, "author".*
from "accounts"
outer apply (
select * from "posts"
where "posts"."author_id" = "accounts"."id"
) "p"
outer apply (
select * from "comments"
where "comments"."post_id" = "p"."id"
) "c"
left join "accounts" "author" on "author"."id" = "c"."author_id"
where "accounts"."id" = 1
但现在我得到了这个错误:
ORA-00904: "p"."id": invalid identifier
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at Line: 9 Column: 34
由于某种原因,我的第二个 OUTER APPLY 加入抱怨我从第一个结果中引用了 "p"."id"。但是当我使用CROSS APPLY时它很好。
发生了什么事?为什么它们之间的行为会有这种差异?
编辑:OUTER APPLY 在这个基本示例中似乎没有必要。这是从一个更复杂的场景中提炼出来的,在这个场景中我必须坚持OUTER APPLY 确实是必要的,但是那个场景的细节与我要问的实际问题无关——这是关于@ 之间这种看似无证的行为差异987654339@和OUTERAPPLY。
编辑:
Oracle 版本: Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production
客户端: Oracle SQL Developer 版本 4.2.0.16.356
服务器:输出uname -a - Linux ubuntu-1gb-sfo2-01 4.4.0-64-generic #85-Ubuntu SMP Mon Feb 20 11:50:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
DDL: link
【问题讨论】:
-
您是否正在寻找对为什么会发生这种情况的明确解释,或者您是否正在寻找一种可以编写查询(应用 CROSS/OUTER)的方法?
-
您使用的是 Oracle 12.1.0.2 或更高版本吗?如果是这样,您可能会遇到导致此行为的错误 20356733。
-
是的,它的版本是 12.1.0.2.0!