在SQL中,如何通过查找列相等的所有行来更新表的每一行,然后将另一列设置为等于另一列

时间:2014-01-08 15:51:58

标签: mysql sql sql-server

所以基本上这就是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永远不会有重复项。如果这是有道理的。

3 个答案:

答案 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,查询将在更新时分别循环遍历每一行。