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

use*_*048 4 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
Run Code Online (Sandbox Code Playgroud)

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

Seb*_*ine 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;
Run Code Online (Sandbox Code Playgroud)

出于几个原因,我更喜欢第二种.原因之一是,你可以替换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 / series.


Gor*_*off 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
Run Code Online (Sandbox Code Playgroud)

  • 连接隐含在`where`子句中. (2认同)