2013-10-21 127 views
1

我有兩個表,Project和Project_Property與從Project到Project_Property的1到很多。我試圖使用子查詢通過項目獲得三個屬性,並加入項目(例如「回購」)。警告:我主要是一個SQL Server的人,所以我試圖把我所知道的SQL工作並投影到Oracle中。帶有Join的Oracle子查詢 - 如何引用子查詢列?

我寫了這個:

select s1.Repo, s1.Solution, p1.Project, a1.Assembly 
from 
(
    select p.name as "Repo", pp.value as "Solution" 
    from project p join project_property pp on p.id=pp.project_id 
    where pp.name='mssolutionname' 
) s1 join 
(
    select p.name as "Repo", pp.value as "Project" 
    from project p join project_property pp on p.id=pp.project_id 
    where pp.name='msprojectname' 
) p1 on p1.Repo=s1.Repo join 
(
    select p.name as "Repo", pp.value as "Assembly" 
    from project p join project_property pp on p.id=pp.project_id 
    where pp.name='msassemblyname' 
) a1 on s1.Repo=a1.Repo; 

但是當我運行它,我得到:

ORA-00904: "S1"."REPO": invalid identifier 

是否有在甲骨文這種類型的查詢不同的格式?如何引用在外部主查詢中的子查詢中選擇的值,特別是有關加入子查詢的值。或者我只是有一個錯過的錯字。不會是第一次。

TIA。

回答

5

如果使用雙引號,你的別名列,則列名成爲區分大小寫。由於您編碼爲p.name as "Repo",因此列必須被稱爲si."Repo"。如果你省略了雙引號(p.name as repo),那麼你可以參考它在不區分大小寫的方式(si.reposi.Repo,或si.rEPo

+1

東西我不知道,但是,在上面的代碼我一致在我的大箱子中的所有引用列別名,我不是嗎? –

+0

但是,刪除雙引號確實解決了問題。每天學些新東西。謝謝。 –

+0

是的,但在oracle中,您必須在創建時使用別名,以便在查詢中使用** s1。「Repo」**也可以。 –

0

那麼既然你已經接受以前的答案,我會建議你改變你的SQL到這個。這將是更具性價比

select 
    p.name as Repo, 
    case when pp.name='mssolutionname' then pp.value else null end as Solution, 
    case when pp.name='msprojectname' then pp.value else null end as Project, 
    case when pp.name='msassemblyname' then pp.value else null end as Assembly 
from 
    project p, 
    project_property pp 
where 
    p.id=pp.project_id 
+1

每個子查詢中的WHERE子句以及子查詢的聯接方式都有其原因。 「項目」表中有數千個條目,但只有20%具有「mssolutionname」屬性。其中只有10%具有「msassemblyname」屬性。我必須向WHERE子句中添加大量代碼才能完成上述工作,否則將其包含在外部查詢中,該查詢會刪除所有空項(大多數爲空)。我可能可以通過移動A1子查詢來改進執行計劃,因爲這是最小的結果集,但整個事件以毫秒爲單位運行...... –