2

我有两个表,Project 和 Project_Property,从 Project 到 Project_Property 是一对多。我正在尝试使用子查询通过 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。

4

2 回答 2

5

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

于 2013-10-21T12:01:35.683 回答
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
于 2013-10-21T12:20:09.703 回答