SQL使用oracle插入带有内连接的数据

时间:2018-02-21 16:08:52

标签: sql oracle sql-update inner-join

SQL新手我有两个表table_Atable_B

我想将数据添加到table_A的特定列中,具体取决于inner join上的table_B。我正在使用Oracle,遵循此method我的SQL看起来像这样:

我首先尝试过:

INSERT INTO table_A (target_column)
SELECT table_B.wanted_data 
FROM table_B INNER JOIN table_A ON table_B.someColumnB = table_A.someColumnA

这里的问题是它会将数据插入我table_A的新行,而不是现有行。

所以我从stackoverflow线程尝试了这个:

UPDATE(SELECT table_A.target_column, table_B.wanted_data
  FROM table_A
  INNER JOIN table_B
  ON table_A.someColumnA = table_B.someColumnB
)
SET table_A.target_table = table_B.wanted_data

但它无法正常工作“SQL命令未正确结束”

编辑: target_columnwanted_data在我的数据集中具有相同的名称,不确定它是否会发生任何变化。

3 个答案:

答案 0 :(得分:1)

SQL Sever:

UPDATE a 
SET    a.target_column = b.wanted_data 
FROM   table_A a 
JOIN   table_B b 
ON     b.someColumnB = a.someColumnA

甲骨文:

UPDATE
(
    SELECT     b.wanted_data   AS wanted_data
              ,a.target_column AS old_data
    FROM       table_A a
    INNER JOIN table_B b
    ON         b.someColumnB = a.someColumnA
)   c
SET c.old_data = c.wanted_data

答案 1 :(得分:1)

关于这种方法,你所说的" SQL命令没有正确结束":

(这是失败的代码:)

update
   ( select table_a.target_column
          , table_b.wanted_data
     from   table_a
            join table_b
                 on  table_b.somecolumnb = table_a.somecolumna
    )
set table_a.usineid = table_b.usineid;

我无法理解您为什么会收到该错误,但最后一行不正确,因为标签table_atable_b仅存在于内联视图中,这是匿名的。 (也没有UsineId但我认为这是你的例子中的复制粘贴问题。)它必须是:

update
   ( select table_a.target_column
          , table_b.wanted_data
     from   table_a
            join table_b
                 on  table_b.somecolumnb = table_a.somecolumna
    )  -- you are updating an anonymous inline view
set target_column = wanted_data;

update
   ( select table_a.target_column
          , table_b.wanted_data
     from   table_a
            join table_b
                 on  table_b.somecolumnb = table_a.somecolumna
    ) v  -- you are updating an inline view named V
set v.target_column = v.wanted_data;

然后,父键table_b.somecolumnb上需要有唯一的索引或约束,否则Oracle将拒绝尝试使用

进行任何更新
  

ORA-01779:无法修改映射到非密钥保留表的列

或者,您可以使用merge

merge into table_a a
using table_b b
      on (b.somecolumnb = a.somecolumna)
when matched then update set a.target_column = b.wanted_data;

答案 2 :(得分:0)

尝试一下:

update  table_A A
set     A.target_column = (
        select table_B_data 
        from   table_B 
        where  shared_key = A.shared_key
        );

只有在table_B中有一行table_B_date时,这才有效。如果有多行,则需要指定密钥