假设p
是主要项目的表格,我们要针对每个主要项目,聚总明细项目的集合。明细项目有两种,来自两个不同的来源。此查询在Oracle 11上使用ORA-00904: "P"."NAME" invalid identifier
时失败,但在Oracle 19上可以正常运作。为什么?
with people (name) as (
select 'Alice' from dual union all
select 'Bob' from dual
), apples (name, title) as (
select 'Alice', 'apple1' from dual union all
select 'Bob', 'apple2' from dual union all
select 'Bob', 'apple3' from dual
), pears (name, title) as (
select 'Alice', 'pear4' from dual union all
select 'Alice', 'pear5' from dual union all
select 'Alice', 'pear6' from dual union all
select 'Bob', 'pear7' from dual union all
select 'Bob', 'pear8' from dual
)
select p.name
, (
select listagg(u.title) within group (order by null)
from (
select x.title from apples x where x.name = p.name
union
select x.title from pears x where x.name = p.name
) u
) as unioned
from people p;
| 名称|联轴节|
| - -|- -|
| 爱丽斯|苹果1梨4梨5梨6|
| 鲍勃|苹果2苹果3梨7梨8|
fiddle
1条答案
按热度按时间fnvucqvd1#
根据 AskTom , 在 相关 子 查询 中 外部 表 的 别名 可见 的 深度 似乎 有 限制 。 Oracle12c 中 已 删除 此 限制 。 对于 Oracle11g , 仍 可以 重写 查询 条件 , 以便 将
p.name
列 提取 到 更 高 级别中 的 每 一 个
或者 将 并集 拆分 为 两 个 部分 , 稍后 再 将 它们 组合 :
格式
这 实际 上 是 我 的 第 一 个 想法 , 但 现在 看来 第 一 个 解决 方案 对 所有 情况 都 足够 了 ( 至少 我 想 不 出 任何 反例 ) 。 在 实际 情况 下 , 聚合 函数 是
collect
而 不是listagg
, 所以 合并 是 使用multiset union
而 不是||
完成 的 。还 相关 :this question 格式