【发布时间】:2011-12-16 15:35:17
【问题描述】:
更新许多行到一个表中基于每个列中的一列相等(user_id)。
两个表都有一个user_id 列。当user_id 列相等时,需要将t2 中的数据插入t1。
提前感谢您提供的任何帮助。
【问题讨论】:
-
赞成。查看相关问题:stackoverflow.com/q/7030699/435605
标签: sql oracle sql-update
更新许多行到一个表中基于每个列中的一列相等(user_id)。
两个表都有一个user_id 列。当user_id 列相等时,需要将t2 中的数据插入t1。
提前感谢您提供的任何帮助。
【问题讨论】:
标签: sql oracle sql-update
update
table1 t1
set
(
t1.column1,
t1.column2
) = (
select
t2.column1,
t2.column2
from
table2 t2
where
t2.column1 = t1.column1
)
where exists (
select
null
from
table2 t2
where
t2.column1 = t1.column1
);
或者这个(如果 t2.column1 t1.column1 是多对一并且其中任何一个都是好的):
update
table1 t1
set
(
t1.column1,
t1.column2
) = (
select
t2.column1,
t2.column2
from
table2 t2
where
t2.column1 = t1.column1
and
rownum = 1
)
where exists (
select
null
from
table2 t2
where
t2.column1 = t1.column1
);
【讨论】:
where。请参阅 Tony Andrews 的回答。
merge into t2 t2
using (select * from t1) t1
on (t2.user_id = t1.user_id)
when matched then update
set
t2.c1 = t1.c1
, t2.c2 = t1.c2
【讨论】:
你总是可以使用和省略“当不匹配部分”
merge into table1 FromTable
using table2 ToTable
on ( FromTable.field1 = ToTable.field1
and FromTable.field2 =ToTable.field2)
when Matched then
update set
ToTable.fieldr = FromTable.fieldx,
ToTable.fields = FromTable.fieldy,
ToTable.fieldt = FromTable.fieldz)
when not matched then
insert (ToTable.field1,
ToTable.field2,
ToTable.fieldr,
ToTable.fields,
ToTable.fieldt)
values (FromTable.field1,
FromTable.field2,
FromTable.fieldx,
FromTable.fieldy,
FromTable.fieldz);
【讨论】:
如果记录已存在于 t1 中(user_id 匹配),则不是插入,除非您乐于创建重复的 user_id。
您可能想要更新?
UPDATE t1
SET <t1.col_list> = (SELECT <t2.col_list>
FROM t2
WHERE t2.user_id = t1.user_id)
WHERE EXISTS
(SELECT 1
FROM t2
WHERE t1.user_id = t2.user_id);
希望对你有帮助...
【讨论】:
如果您想用 t2 中的数据更新 t1 中的匹配行,则:
update t1
set (c1, c2, c3) =
(select c1, c2, c3 from t2
where t2.user_id = t1.user_id)
where exists
(select * from t2
where t2.user_id = t1.user_id)
“where exists”部分是为了防止在不存在匹配项的情况下将 t1 列更新为 null。
【讨论】: