【问题标题】:UPDATE with INNER JOIN on SQL Server在 SQL Server 上使用 INNER JOIN 进行更新
【发布时间】:2020-03-20 14:46:53
【问题描述】:

我有 2 张桌子 UsersOrdersUsers的主键是UserId,我在Orders表中定义为外键。我在Orders 中添加了UserName 的新列。我想从Users 表中导入UserName

我正在尝试运行此代码,但它不断给我错误。谁能告诉我可能出了什么问题?

UPDATE Orders 
SET Orders.UserName = Users.UserName 
INNER JOIN Users ON Orders.UserId = Users.UserId;

【问题讨论】:

    标签: sql sql-server sql-update inner-join


    【解决方案1】:

    这不是正确的语法

    UPDATE O 
    SET O.UserName = U.UserName 
    from Orders O
    INNER JOIN Users U ON O.UserId = U.UserId ;
    

    当您的查询涉及多个表时,您需要开始使用Alias 进行表引用。使用别名使查询更具可读性。

    【讨论】:

      【解决方案2】:

      您缺少订单表名称

      UPDATE Orders 
      SET Orders.UserName = Users.UserName 
      from Orders
      INNER JOIN Users ON Orders.UserId = Users.UserId ;
      

      【讨论】:

        【解决方案3】:

        没有UPDATEINNER JOIN,请重新编写您的查询如下:

        您只能在FROM 子句之后使用INNER JOIN

        UPDATE Orders SET Orders.UserName = Users.UserName 
        FROM Users WHERE Orders.UserId = Users.UserId
        

        【讨论】:

          【解决方案4】:

          我其实很喜欢这里更新的 CTE 版本,因为它让我们可以像在选择中一样表达连接逻辑,而不会产生任何潜在的混淆:

          WITH cte AS (
              SELECT o.UserName AS user_old, u.UserName AS user_new
              FROM Orders o
              INNER JOIN Users u ON u.UserId = o.UserId
          )
          
          UPDATE cte
          SET user_old = user_new;
          

          【讨论】:

          • @wakanada 我的答案在只写一个选择更容易的情况下变得有用。在这种情况下,您接受的答案并不太冗长,但有时可以更新。
          【解决方案5】:

          您的查询结构应如下所示:

          UPDATE 
          
          t1
          SET 
              t1.c1 = t2.c2,
              t2.c2 = expression,
              ...   
          FROM 
              t1
              [INNER | LEFT] JOIN t2 ON join_predicate
          WHERE 
              where_predicate;
          

          所以你的实际查询应该如下所示:

          UPDATE Orders SET Orders.UserName = Users.UserName 
          FROM Users WHERE Orders.UserId = Users.UserId
          

          【讨论】:

            猜你喜欢
            • 2013-01-07
            • 2013-05-05
            • 2021-02-04
            • 2015-07-29
            • 1970-01-01
            • 1970-01-01
            • 2014-11-30
            • 1970-01-01
            相关资源
            最近更新 更多