以下查询不起作用。由于temp.col
引用了在该上下文中不可用的内容,因此预计会失败。FROM子句中的TABLE/CAST/MULTISET与子查询
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”:无效的标识符
偏偏是一个查询工作?我将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之一的生成名称。
编辑
与下面的接受的答案,我查了资料,发现表机制是表集合表达。圆括号之间的表达式是收集表达式。的单证定义了一个名为左相关机构:
的collection_expression可以引用留在FROM子句定义为 其表的列。这被称为左相关。只有在table_collection_expression中才会发生相关性 。其他 子查询不能包含对在 子查询之外定义的列的引用。
所以这就像12c中的LATERAL。
如果我们需要使用connect by中第一个表的列,那么我猜table/cast/multiset是必须的。这将允许我们避免获得完整的交叉产品。当然我的例子是在选择列表中使用它,我们没有过滤交叉产品。 – lkuty