2013-04-15 240 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