【发布时间】:2015-06-02 14:19:00
【问题描述】:
以下查询不起作用。预计会失败,因为 temp.col 引用了在该上下文中不可用的内容。
with temp as (
select 'A' col from dual
union all
select 'B' col from dual
)
select *
from temp,
(select level || temp.col from dual connect by level < 3);
来自 Oracle 的错误消息是:ORA-00904: "TEMP"."COL": invalid identifier
但为什么下一个查询有效?我认为 CAST/MULTISET 是一种从 SQL 表到集合类型和 TABLE 回到 SQL 表的方法。为什么我们使用这样的往返?我想使查询工作,但如何?
with temp as (
select 'A' col from dual
union all
select 'B' col from dual
)
select *
from temp,
table(
cast(
multiset(
select level || temp.col from dual connect by level < 3
) as sys.odcivarchar2list
)
) t;
结果是:
COL COLUMN_VALUE
--- ------------
A 1A
A 2A
B 1B
B 2B
看看第二列是如何命名的COLUMN_VALUE。看起来像是由构造 CAST/MULTISET 或 TABLE 之一生成的名称。
编辑
有了下面接受的答案,我查了文档,发现TABLE机制是一个表集合表达式。圆括号之间的表达式是集合表达式。文档定义了一种称为左相关的机制:
collection_expression 可以引用定义为的表的列 它留在 FROM 子句中。这称为左相关。剩下 关联只能发生在 table_collection_expression 中。其他 子查询不能包含对在 子查询。
所以这就像 12c 中的 LATERAL。
【问题讨论】: