2015-11-25 26 views
0

如何訪問子查詢中的「父」屬性。Oracle:在子查詢中訪問父屬性

E.g.如果我有以下最小工作實例片段,我期望作爲輸出

「1,2:3」

然而它失敗

ORA-904,T1.F1不合法的識別符。

現在我知道我可以重寫這個完整的查詢得到這個工作,但是理由問這個是:

  • 爲什麼我不能訪問「外部」 attrbute?
  • 如何以較少的修改訪問它,並且
  • 我想添加一個列,而無需太多地對外部查詢進行調試。

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; 

回答

0

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

甲骨文只允許子查詢訪問其直接父查詢表...其實,你要訪問的主查詢子查詢子查詢。

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

這樣,你的外部查詢並沒有改變,所以你可以管理它,你想要的方式。

+0

嗨,是的,我發現這個解決方案已經是我自己了,但是,爲什麼我不能從子查詢中的子訪問父屬性,這個父屬性應該保持穩定(相同),當子查詢和sub-in-subquery正在運行 – robert

+0

「ANSI SQL的表格引用(相關名稱)的作用範圍僅爲[asktom](https://asktom.oracle.com/pls/asktom/f?p=100: 11:0 :::: P11_QUESTION_ID:1853075500346799932) –