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