带有Join的Oracle子查询 - 如何引用子查询列?

时间:2013-10-21 11:57:17

标签: sql oracle join

我有两个表,Project和Project_Property,从Project到Project_Property有1到多个。我正在尝试使用子查询通过Project获取三个属性并加入Project(示例中的“Repo”)。警告:我主要是一个SQL Server人员,因此我正在尝试将我所知道的工作用于SQL并将其投影到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

Oracle中此类查询是否有不同的格式?如何引用外部主查询中子查询中选择的值,尤其是在加入子查询时。或者我只是错过了一个错字。这不是第一次。

TIA。

2 个答案:

答案 0 :(得分:5)

如果使用双引号对列进行别名,则列名称将区分大小写。由于您编码为p.name as "Repo",因此列必须称为si."Repo"。如果您不使用双引号(p.name as repo),则可以不区分大小写的方式引用它(si.reposi.Reposi.rEPo

答案 1 :(得分: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