4

我有以下 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 行受影响,那么我的逻辑有什么问题?

4

2 回答 2

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 SETSELECT以获取可执行的 SELECT 语句。另一个是意图没有像第一个选项那样被隐藏。您还可以使用第一个选项未提供的 LEFT OUTER 或其他连接类型。

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

于 2013-01-07T21:08:42.563 回答
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
于 2013-01-07T20:37:37.950 回答