查询在Oracle 11上失败,并显示ORA-00904,但在Oracle 19上未显示

d6kp6zgx  于 2022-11-22  发布在  Oracle
关注(0)|答案(1)|浏览(134)

假设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

fnvucqvd

fnvucqvd1#

根据 AskTom , 在 相关 子 查询 中 外部 表 的 别名 可见 的 深度 似乎 有 限制 。 Oracle12c 中 已 删除 此 限制 。 对于 Oracle11g , 仍 可以 重写 查询 条件 , 以便 将 p.name 列 提取 到 更 高 级别

select p.name
     , (
         select listagg(u.title) within group (order by null)
         from (
           select x.title, x.name from apples x
           union
           select x.title, x.name from pears  x
         ) u
         where u.name = p.name
       ) unioned
from people p;

中 的 每 一 个
或者 将 并集 拆分 为 两 个 部分 , 稍后 再 将 它们 组合 :

(with ...)
, parts as (
  select p.name
       , (
           select listagg(x.title) within group (order by null)
           from apples x 
           where x.name = p.name
         ) x
       , (
           select listagg(x.title) within group (order by null)
           from pears x 
           where x.name = p.name
         ) y
  from people p
)
select name, x || y from parts;

格式
这 实际 上 是 我 的 第 一 个 想法 , 但 现在 看来 第 一 个 解决 方案 对 所有 情况 都 足够 了 ( 至少 我 想 不 出 任何 反例 ) 。 在 实际 情况 下 , 聚合 函数 是 collect 而 不是 listagg , 所以 合并 是 使用 multiset union 而 不是 || 完成 的 。
还 相关 :this question 格式

相关问题