首页  >  问答  >  正文

联合两个具有不同列数的表格

<p>我有两个表(表A和表B)。</p> <p>这两个表的列数不同 - 假设表A有更多的列。</p> <p>我如何将这两个表合并,并在表B没有的列上获取null值?</p>
P粉879517403P粉879517403443 天前532

全部回复(2)我来回复

  • P粉670107661

    P粉6701076612023-08-25 17:20:32

    我来到这里并按照上面的答案操作。但是数据类型的顺序不匹配导致了一个错误。下面来自另一个答案的描述会很有用。

    上面的结果与您的表中的列顺序相同吗?因为Oracle在列顺序上很严格。下面的示例会产生一个错误:

    create table test1_1790 (
    col_a varchar2(30),
    col_b number,
    col_c date);
    
    create table test2_1790 (
    col_a varchar2(30),
    col_c date,
    col_b number);
    
    select * from test1_1790
    union all
    select * from test2_1790;

    ORA-01790: 表达式必须具有与相应表达式相同的数据类型

    正如您所看到的,错误的根本原因在于通过使用*作为列列表指定符来暗示的列顺序不匹配。通过显式输入列列表,可以轻松避免这种类型的错误:

    select col_a, col_b, col_c from test1_1790 union all select col_a, col_b, col_c from test2_1790; 这种错误更常见的情况是当您在SELECT列表中无意中交换(或移动)两个或多个列时:

    select col_a, col_b, col_c from test1_1790
    union all
    select col_a, col_c, col_b from test2_1790;

    或者,如果上述方法不能解决您的问题,那么如何在列中创建一个别名呢,就像这样:(查询与您的查询不同,但这里的重点是如何在列中添加别名。)

    SELECT id_table_a, 
           desc_table_a, 
           table_b.id_user as iUserID, 
           table_c.field as iField
    UNION
    SELECT id_table_a, 
           desc_table_a, 
           table_c.id_user as iUserID, 
           table_c.field as iField

    回复
    0
  • P粉662361740

    P粉6623617402023-08-25 15:53:13

    对于列较少的表,可以添加额外的空列,例如:

    Select Col1, Col2, Col3, Col4, Col5 from Table1
    Union
    Select Col1, Col2, Col3, Null as Col4, Null as Col5 from Table2

    回复
    0
  • 取消回复