【问题标题】:Data from two tables into one view来自两个表的数据到一个视图中
【发布时间】:2011-03-17 02:12:24
【问题描述】:

是否可以将两个表(具有相同字段)中的数据抓取到一个视图中。基本上,视图将数据视为一张表。

【问题讨论】:

    标签: sql oracle sql-view


    【解决方案1】:

    是的,使用 UNION -

    CREATE VIEW vw_combined AS
       SELECT * FROM TABLE1
       UNION ALL
       SELECT * FROM TABLE2
    

    ...要求列数相同,并且每个位置的数据类型匹配。

    ..最好使用 JOIN:

    CREATE VIEW vw_combined AS
       SELECT * 
        FROM TABLE1 t1
        JOIN TABLE2 t2 ON t2.col = t1.col
    

    但我想警告不要依赖于视图 - 如果没有具体化,它们只是准备好的 SQL 语句。没有性能优势,如果您基于另一个视图构建视图,可能会对性能产生负面影响。此外,视图很脆弱 - 它们可能会发生变化,并且在使用支持视图之前您不会知道是否存在问题。

    【讨论】:

    • "最好使用 JOIN" 仅当满足要求时。我没有看到 table1 和 table2 中的行以连接有意义的方式相关的暗示。 OP 确实声明:“具有相同的字段”,因此如果类型匹配,联合将起作用。
    • @Shannon Severance:我认为建议对逻辑进行审查或提供可能有帮助的其他信息没有害处。
    • 我同意提及联接是件好事,因为有两种方法可以组合两个表格,从而使结果比表格本身更长或更宽。 (顺便说一句,+1。)我只是不认为一个比另一个更可取,而不知道 OP 正在尝试做什么。
    【解决方案2】:
    create or replace view view_name as
    select * from table_1
    union all select * from table_2
    

    注意: 视图中的列是在创建视图时设置的。视图创建后向 table_1 和 table_2 添加列将不会显示在 view_name 中。您需要重新运行上述 DDL 才能显示新列。

    如果您希望将重复的行合并为单行(但服务器可能需要做更多的工作):

    create or replace view view_name as
    select * from table_1
    union select * from table_2
    

    通常在选择列表中使用* 是一种不好的形式,但假设使用视图的查询将选择他们需要的内容,我将在此处使用它而不是显式命名所有列。 (特别是因为我不想在 table_1 和 table_2 更改时添加列名。)

    【讨论】:

    • @OMG Ponies:最近我被咬到了,记忆库里很新鲜。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    相关资源
    最近更新 更多