2013-04-15 239 views
0

我想在ORACLE數據庫中運行一個查詢,但我一直在失敗的白色以下錯誤「I.ID無效標識符」。 我想要做的是從嵌套查詢中選擇一個給定的結果,使用應該相互關聯嵌套查詢和上一級查詢的過濾器。SQL oracle嵌套查詢

The query is: 
SELECT i.name, WOW.BI,WOW.BC, WOW.CP 

from inv_investments i, 
inner join (select 
bi.COSTI BI, 
bc.COSTI BC, 
cp.COSTI AS CP 

FROM 
(select atom.COSTI from 
(select odf.IF_CST_TOT COSTI 
from prj_baselines bl 
inner join odf_ca_baseline odf on odf.id = bl.id 
WHERE i.id = bl.project_id 
ORDER BY bl.created_date DESC) atom where rownum =1) cp, 

(select odf.IF_CST_TOT COSTI 
from prj_baselines bl 
inner join odf_ca_baseline odf on odf.id = bl.id 
where odf.if_budget = 1 
AND i.id = bl.project_id) bi, 

(select odf.IF_CST_TOT COSTI 
from prj_baselines bl 
inner join odf_ca_baseline odf on odf.id = bl.id 
Where if_budget_corrente = 1 
AND i.id = bl.project_id) bc ) WOW on wow.ID = i.ID 

你知道如何解決嗎?每次我檢查在嵌套查詢(如WHERE i.id = bl.project_id)我得到錯誤的條款等

+0

您是否假定每個子查詢cp,bi和bc將爲每個項目/投資ID返回一行? –

回答

0

假設每個子查詢CP,雙和bc是打算返回每個項目/投資ID一排,你應該能夠獨立的子查詢組合成一個單一的查詢 - 就像這樣:

with cte as 
(select i.id, 
     i.name, 
     row_number() over (partition by i.id ORDER BY bl.created_date DESC) rn, 
     o.IF_CST_TOT, 
     o.if_budget, 
     if_budget_corrente 
from inv_investments i 
join prj_baselines b on i.id = b.project_id 
join odf_ca_baseline o on b.id = o.id) 
select max(name) name, 
     max(case rn when 1 then IF_CST_TOT end) BI, 
     max(case if_budget when 1 then IF_CST_TOT end) BC, 
     max(case if_budget_corrente when 1 then IF_CST_TOT end) CP 
from cte 
group by id 
+0

優秀,這是更優雅,它完美的工作。 – splogad

3

以下語法不正確:

SELECT i.name, WOW.BI,WOW.BC, WOW.CP 
from inv_investments i, 
inner join (select . . . 

你有一個逗號之後i以及inner join聲明。

您的查詢有點難以遵循,但我認爲簡單的解決辦法是刪除inner join並將on子句更改爲where子句。

+1

很好的捕捉懸垂的逗號,雖然我不*使用隱式連接而不使用顯式'內部連接'語法。 –

+0

對不起,這是一個複製粘貼錯誤。 – splogad