【问题标题】:SQL insert data with inner join using oracleSQL 使用 oracle 插入带有内部连接的数据
【发布时间】:2018-02-21 16:08:51
【问题描述】:

SQL 新手我有两个表table_Atable_B

我想根据table_B 上的inner join 将数据添加到table_A 的特定列中。我正在使用 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 在我的数据集中具有相同的名称,不确定它是否会改变任何内容。

【问题讨论】:

  • 您是否真的错过了检查主查询中的 SET 语句应该是 table_A.UsineId 而不是 table_A_UsineId
  • @KaushikNayak 想念我,我会纠正它
  • 您是否已经完全通过该线程并尝试了所有替代方案?例如:您也可以使用 MERGE INTO 。我认为您在复制和修改查询时可能犯了一个错误。
  • @KaushikNayak 没试过 MERGE,会试试

标签: sql oracle sql-update inner-join


【解决方案1】:

SQL 服务器:

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

【讨论】:

  • 使用Oracle好像不能更新&加入
  • @LoganWlv 抱歉错过了 Oracle,我已经更新了我的答案。
  • 似乎我有一个问题“列定义不明确”,我认为这是由于我的 target_column 和 Wanted_data 的名称相同,请检查我的上次编辑
  • @LoganWlv 啊好吧给选择别名,所以像 SELECT b.wanted_data AS Wanted_data,a.target_column AS old_data....... SET c.old_data = c.wanted_data,我会再次编辑我的答案。
  • @LoganWlv 您缺少选择的名称。 “SQL 命令未正确结束”请注意 SELECT 末尾代码中的“c”。
【解决方案2】:

关于这种方法,您所说的失败并显示“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;

【讨论】:

    【解决方案3】:

    试试这个:

    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 的情况下才有效。如果有多行,需要指定key

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 2014-09-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      • 2020-03-27
      相关资源
      最近更新 更多