【问题标题】:Oracle subqueries with Join - how to refer to subquery column?带有 Join 的 Oracle 子查询 - 如何引用子查询列?
【发布时间】:2013-10-21 11:57:17
【问题描述】:

我有两个表,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。

【问题讨论】:

    标签: sql oracle join


    【解决方案1】:

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

    【讨论】:

    • 一些我不知道的事情,但是,在上面的代码中,我在所有对列别名的引用中的大小写都是一致的,不是吗?
    • 但是,删除双引号确实解决了问题。每天学些新东西。谢谢。
    • 是的,但是在 oracle 中,您必须在创建时使用别名,因此在使用 s1."Repo" 的查询中也可以使用。
    【解决方案2】:

    好吧,既然您已经接受了先前的答案,我建议您将您的 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
    

    【讨论】:

    • 每个子查询中的 WHERE 子句以及子查询的 JOIN 方式是有原因的。我们在 Projects 表中有数千个条目,但可能只有 20% 具有“mssolutionname”属性。其中只有 10% 具有“msassemblyname”属性。我必须在 WHERE 子句中添加大量代码才能使上述工作正常进行,或者将其包装在一个外部查询中,该查询会删除所有空条目,其中大部分是空条目。我可能可以通过将 A1 子查询移动到第一个来改进执行计划,因为这是最小的结果集,但整个事情在毫秒内运行......
    猜你喜欢
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多