【问题标题】:CREATE New Table from existing tables in Oracle 11g从 Oracle 11g 中的现有表创建新表
【发布时间】:2013-11-12 02:46:48
【问题描述】:

我有 2 个没有主键的表。这 2 个表具有相同的行数。我想通过从表 1 中获取一些列和从表 2 中获取一些列来创建一个新表。我想将表 1 的第一行和表 2 的第一行组合起来。 下面是例子

表 1

ACOL1 ACOL2 ACOL3 A1 A2 A3 B1 B2 B3 C1 C2 C3

表2

BCOL1 BCOL2 BCOL3
11 12 13
21 22 23
31 32 33

COMBINED_TABLE

ACOL1 BCOL2 BCOL3
A1 12 13
B1 22 23
C1 32 33

我尝试了以下查询,但没有运气。它给出以下错误:
查询:

create table COMBINED_TABLE 
AS 
select a.ACOL1, b.BCOL2, b.BCOL3 
from (select ACOL1,rownum from TABLE1) a, 
     (select BCOL2, BCOL3, rownum from TABLE2) b 
WHERE a.rownum = b.rownum

错误: ORA-01747:"invalid user.table.column, table.column, or column specification"

【问题讨论】:

    标签: sql oracle


    【解决方案1】:
    create table combined_table
    as
    select a.acol1, b.bcol2, b.bcol3
    from (
      select acol1, row_number() over (order by acol1) as rn
      from table1
    ) a 
      join (
        select bcol2, bcol3, row_number() over (order by bcol1) as rn
        from table2
      ) b on a.rn = b.rn
    

    使用row_number()rownum 更健壮,因为您实际上可以定义“最后”或“第一”行的含义(除非定义了某些顺序,否则这些术语没有意义)。

    当您在窗口函数中定义 order by 时,生成的连接更加稳定,因为行号总是以相同的方式计算(rownum 的情况不是)。

    【讨论】:

      【解决方案2】:

      你不能使用rownum作为列名,给它一个别名可以解决问题

      create table COMBINED_TABLE 
      AS 
      select a.ACOL1, b.BCOL2, b.BCOL3 
      from (select ACOL1,rownum rn from TABLE1) a, 
           (select BCOL2, BCOL3, rownum rn from TABLE2) b 
      WHERE a.rn = b.rn
      

      【讨论】:

      • 非常感谢您,Maxim,您拯救了这一天。
      【解决方案3】:

      试试这个:

      CREATE TABLE table1a (
        acol1 NUMBER,
        acol2 NUMBER,
        acol3 NUMBER
      );
      
      CREATE TABLE table2a (
        bcol1 NUMBER,
        bcol2 NUMBER,
        bcol3 NUMBER
      );
      
      INSERT INTO table1a VALUES (1, 2, 3);
      INSERT INTO table1a VALUES (4, 5, 6);
      
      INSERT INTO table2a VALUES (10, 20, 30);
      INSERT INTO table2a VALUES (40, 50, 60);
      
      CREATE TABLE combined_table (ct1, ct2, ct3) AS
        SELECT a.acol1, b.bcol2, b.bcol3
          FROM
            (SELECT a.*, rownum AS rn FROM table1a a) a,
            (SELECT b.*, rownum AS rn FROM table2a b) b
        WHERE a.rn = b.rn
      ;
      

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 1970-01-01
        • 2021-12-18
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 2020-09-07
        • 1970-01-01
        相关资源
        最近更新 更多