SQL内部连接来自不同数据库的两个表并更新其中一个表

时间:2013-01-07 20:33:01

标签: sql sql-server sql-server-2008-r2 sql-server-2012

我有以下SQL查询:

UPDATE db1.dbo.oitems
SET f2 = oo.f2,
f3 = oo.f3,
f4 = oo.f4
FROM db1.dbo.oitems o
       INNER JOIN db2.dbo.oitems oo 
               ON o.orderid = oo.orderid

每个表都在不同的数据库中,它们具有相同的列但不同的数据,其中一些匹配在id但不在数据中。我只想将我要更新的表中的列f2,f3,f4的值设置为第二个表中的值,如果它们具有相同的orderid。上面的命令一直说0行受影响,所以我的逻辑出了什么问题?

2 个答案:

答案 0 :(得分:6)

您有两种方法可以解决此问题。第一个是Gordon Linoff在另一个答案中描述的。第二个看起来像这样:

UPDATE o
SET f2 = oo.f2,
f3 = oo.f3,
f4 = oo.f4,
FROM db1.dbo.oitems o
INNER JOIN db2.dbo.oitems oo 
ON o.orderid = oo.orderid;

我更喜欢第二种,原因有几个。一个原因是您可以用UPDATE o SET替换SELECT以获取可执行的SELECT语句。另一个是意图不是隐藏在第一个选项中。您还可以使用LEFT OUTER或第一个选项未提供的其他连接类型。

有关所有这些检查的更深入的解释 http://sqlity.net/en/1595/a-join-a-day-update-delete/ 以及http://sqlity.net/en/1146/a-join-a-day-introduction/系列的其余部分。

答案 1 :(得分:5)

您的问题中的查询有语法错误,所以我很惊讶它运行(set子句中的最后一个逗号)。我会把查询写成:

UPDATE db1.dbo.oitems
    SET f2 = oo.f2,
        f3 = oo.f3,
        f4 = oo.f4
    FROM db2.dbo.oitems oo 
    WHERE oitems.orderid = oo.orderid
相关问题