Oracle:在子查询中访问父属性

时间:2015-11-25 13:45:06

标签: sql oracle11g

如何在子查询中访问“父”属性。

E.g。如果我有以下最小工作示例片段,我希望作为输出

  

“1,2:3”

然而

失败了
  

ORA-904,T1.F1无效标识符。

现在我知道我可以重写这个完整的查询以使其正常工作,但是问这个的理由是:

  • 为什么我无法访问'外部'属性?
  • 如何以较少的修改和
  • 访问它
  • 我想添加一个列而不会过多地调整外部查询。

MWE:

create table T1(F1 INTEGER);
create table T2(F2 INTEGER,F3 INTEGER);

insert into T1(F1) VALUES(1);
insert into T2(F2,F3) VaLUES(1,2);
insert into T2(F2,F3) VALUES(1,2);
insert into T2(F2,F3) VALUES(1,3);

select T1.F1,
     (SELECT LISTAGG(A,':') WITHIN GROUP (ORDER BY A) from (select distinct(F3) as A froM T2 where F2 = T1.F1)) as B
from T1;

1 个答案:

答案 0 :(得分:0)

1) Why can't I access the 'outer' attribute?

Oracle只允许子查询访问其直接父查询表...实际上,您正在尝试访问子查询的子查询中的主查询。

2) How can I access it with less modification

您的最内部子查询可以被删除,您可以应用正则表达式删除重复项,如下所示:

select 
  T1.F1,
  (
    SELECT REGEXP_REPLACE(
      LISTAGG(F3,':') WITHIN GROUP (ORDER BY F3), 
      '([^:]+):(\1(:|$))+', 
      '\1\3'
    ) 
    from T2 
    where F2 = T1.F1
  ) as B
from T1;

此正则表达式找到任何非重复的标记(标记=在:之前或行结束之前的数据)并检查下一个标记以查找任何重复,替换所找到的第一个非重复的所有匹配和:如果它不是行尾。

3) I want to add a column without modyfing the outer query too much

这样您的外部查询就没有改变,因此您可以按照自己的方式进行管理。