所以基本上这就是psuedo代码,但我不知道如何在SQL中执行此操作,请帮忙。
for each row in table1{
loop through each row in table 2 {
if table1's row.column 1 = table2's row.column 2 for this row {
set table1's row.col2 = table2's row.col2
}
}
}
编辑:好的,让我更具体一点。我们基本上从hibernate序列切换为id,使用guid作为id列。我正在尝试通过创建上一个外键列的临时更新相关的外键,然后匹配临时列以更新实际列。
假设表1有id,而表2有一列用于将这些id用作外键。我想使用表2中的先前值与表1中的行匹配,并设置表2中的键值以匹配表1的新guid。
因此表2可能有多行重复ID,但表1永远不会有重复项。如果这是有道理的。
答案 0 :(得分:13)
在SQL Server中,您可以执行以下操作:
UPDATE Table_1 SET Column_2 = t2.Column_2 FROM Table_1 AS t1 INNER JOIN Table_2 AS t2 ON t2.Column_1 = t1.Column_1
或类似
UPDATE Table_1 SET Column_2 = ( SELECT t2.Column_2 FROM Table_2 AS t2 WHERE t2.Column_1 = Table_1.Column_1 )
当然,如果Table_2中有多行,则会出现错误....
答案 1 :(得分:4)
它的基础是:
UPDATE Table1 SET col2 =
(select col2 FROM Table2 where Table2.column2 = Table1.column1)
但是,如果两个表中的行之间没有1-1对应关系,那可能无法完全满足您的要求 - 因此我目前的评论低于您的问题:
如果表2中有多个匹配的行,会发生什么?如果没有匹配的行会发生什么?
答案 2 :(得分:0)
为了澄清我在其他 DBMS(如 FIREBIRD)中遇到的一个问题,例如,在子查询中,您需要在子句中使用 distinct 进行选择,如下所示:
UPDATE Table1 SET col2 =
(select DISTINCT col2 FROM Table2 where Table2.column2 = Table1.column1)
否则您将收到此错误 Multiple rows in singleton select
。
这是有道理的,因为你不能选择并返回多行来只更新一行,所以使用 DISTINCT
,查询将在更新时分别循环遍历每一行。