2013-04-15 5 views
0

J'essaie d'exécuter une requête dans une base de données ORACLE mais je continue d'échouer avec l'erreur suivante "identifiant I.ID invalide". Ce que j'essaie de faire est de sélectionner un résultat donné à partir d'une requête imbriquée à l'aide d'un filtre censé interagir avec la requête imbriquée et la requête de niveau supérieur.Requête SQL oracle imbriquée

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 

Savez-vous comment le réparer? Chaque fois que je s'enregistrer clause where d'une requête imbriquée (par exemple lorsque i.id = bl.project_id) je reçois l'erreur ...

+0

Supposons-nous que chacune des sous-requêtes cp, bi et bc renvoie une ligne par projet/identifiant d'investissement? –

Répondre

0

En supposant que chacun des sous-requêtes cp, bi et bc est destiné à retourner une ligne par id projet/investissement, vous devriez être en mesure de combiner les sous-requêtes distinctes en une seule requête - comme ceci:

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

Excellent, c'est beaucoup plus élégant et il fait parfaitement son travail. – splogad

3

La syntaxe suivante est incorrecte:

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

Vous avez une virgule après i ainsi qu'une instruction inner join.

Votre requête est un peu difficile à suivre, mais je pense que la solution facile serait de supprimer le inner join et de remplacer la clause on par une clause where.

+1

Bonne capture de la virgule pendante, bien que je n'accepte pas * aggree utilisant des jointures implicites au lieu de la syntaxe explicite de 'join join'. –

+0

Désolé, il s'agit d'une erreur de copier/coller. – splogad