Oracle - 如何对视图执行左连接?

Posted

技术标签:

【中文标题】Oracle - 如何对视图执行左连接?【英文标题】:Oracle - how to perform left join on views? 【发布时间】:2017-12-30 16:21:02 【问题描述】:

如何在 Oracle 上使用左连接创建视图?

我可以使用这个语句创建一个连接表

select *
from
    concert_copy c
    left join event_copy e
        on c.concert_id=e.concert_id;

但是当我使用这个语句创建视图时给了我错误

“ORA-00957:列名重复”

create view concert_event as
    select *
    from
        concert_copy c
        left join event_copy e
            on c.concert_id=e.concert_id;

【问题讨论】:

【参考方案1】:

至少concert_id 列出现在两个表中。 SELECT * 将导致视图具有 2 个具有相同名称的列。解决方案:至少为其中一个表明确指定字段

create view concert_event as
    select c.*, e.eventname, ...
    from
        concert_copy c
        left join event_copy e
            on c.concert_id = e.concert_id;

如果有其他重复名称,请使用别名。例如。如果两个表都有一列name

select c.*, e.name as eventname, ...

注意:如果您直接调用SELECT,Oracle 会自动为重复的列和表达式创建通用名称,但在视图中要求所有列名都可以从声明中看到,因为它们与选定列的名称匹配或者因为给出了别名。

【讨论】:

【参考方案2】:

不要使用星号(即 SELECT *),而是命名您选择的所有列,并为每个列指定独特的名称。例如,如果 CONCERT_COPY 和 EVENT_COPY 都有名为 ID 的列,则您必须

select c.id concert_id, e.id event_id, ...
from concert_copy c left join event_copy e ...

【讨论】:

哦我不能用星号?唐,我不知道。谢谢@Littlefoot 你可以,但这通常是个坏主意。最好命名所有列,特别是如果您编写将在生产中使用的代码。可能需要维护您的代码的人会确切地知道您选择了什么。 "SELECT " 对于 *quick and dirty 选择是可以的,但是 - 正如你所看到的 - 它可能会导致问题。 是否可以在视图中的那些列上进行更新?为什么我不能更新视图上的每一列? 更新?是的,以及插入或删除。通常的方法是通过 而不是 触发器。更多信息:docs.oracle.com/cd/B10501_01/server.920/a96524/… 另见In Oracle, is it possible to INSERT or UPDATE a record through a view?的答案

以上是关于Oracle - 如何对视图执行左连接?的主要内容,如果未能解决你的问题,请参考以下文章

oracle 左外连接如果右表中有重复数据如何处理?

Oracle左连接右连接全外连接(+)号作用

两个左连接SQL执行计划解析(Oracle和PGSQL对比):

Oracle左连接

oracle 中在左连接的时候不能全部显示左表中的数据

简化冗余左连接