【问题标题】:SQL inner join two tables from separate databases and update one of themSQL内部连接来自不同数据库的两个表并更新其中一个
【发布时间】:2013-01-07 20:33:00
【问题描述】:

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

【问题讨论】:

  • update 子句中的表必须与from 子句中的表相关或相同 - 这意味着您可能在 db1 表中编写了update o ... 或省略别名。

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


【解决方案1】:

您有两种选择来解决这个问题。第一个是由 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/ 系列的其余部分。

【讨论】:

    【解决方案2】:

    您问题中的查询有语法错误,所以我很惊讶它运行(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
    

    【讨论】:

    • 您是否还需要为此做一个JOIN
    • 连接隐含在 where 子句中。
    • 啊,我不习惯这种语法。 +1 让我学到新东西
    猜你喜欢
    • 2018-04-27
    • 2014-10-05
    • 1970-01-01
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多