SQL新手我有两个表table_A
和table_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_column
和wanted_data
在我的数据集中具有相同的名称,不确定它是否会发生任何变化。
答案 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_a
和table_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时,这才有效。如果有多行,则需要指定密钥