从Oracle 11g中的现有表创建新表

时间:2013-10-31 22:26:06

标签: sql oracle

我有2个没有主键的表。这两个表具有相同的行数。我想通过从table1获取一些列和从表2中获取一些列来创建一个新表。我想组合table1的第一行和table2的第一行。 以下是示例

TABLE1

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

TABLE2

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:“user.table.column,table.column或列规范无效”

3 个答案:

答案 0 :(得分: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时,结果连接更稳定,因为行号总是以相同的方式计算( {{1}的情况})。

答案 1 :(得分:0)

您不能将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

答案 2 :(得分:0)

试试这个:

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
;