sql - 如何在 SQL Server 中使用 JOIN 执行 UPDATE 语句?

标签 sql sql-server tsql sql-server-2005 sql-update

我需要使用其“父”表中的数据更新 SQL Server 中的此表,如下所示:

表格:销售

id (int)
udid (int)
assid (int)

表:ud

id  (int)
assid  (int)

sale.assid 包含更新 ud.assid 的正确值。

什么查询可以做到这一点?我正在考虑加入,但不确定是否可行。

最佳答案

语法严格取决于您使用的 SQL DBMS。以下是在 ANSI/ISO(也适用于任何 SQL DBMS)、MySQL、SQL Server 和 Oracle 中执行此操作的一些方法。请注意,我建议的 ANSI/ISO 方法通常比其他两种方法慢得多,但如果您使用的是 MySQL、SQL Server 或 Oracle 之外的 SQL DBMS,那么它可能是唯一的方法(例如如果您的 SQL DBMS 不支持 MERGE):

ANSI/ISO:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where exists (
      select * 
      from sale 
      where sale.udid = ud.id
 );

MySQL:

update ud u
inner join sale s on
    u.id = s.udid
set u.assid = s.assid

SQL 服务器:

update u
set u.assid = s.assid
from ud u
    inner join sale s on
        u.id = s.udid

PostgreSQL:

update ud
  set assid = s.assid
from sale s 
where ud.id = s.udid;

请注意,Postgres 的 FROM 子句中的目标表不得重复。主要问题:How to do an update + join in PostgreSQL?

甲骨文:

update
    (select
        u.assid as new_assid,
        s.assid as old_assid
    from ud u
        inner join sale s on
            u.id = s.udid) up
set up.new_assid = up.old_assid

SQLite:

update ud 
     set assid = (
          select sale.assid 
          from sale 
          where sale.udid = ud.id
     )
 where RowID in (
      select RowID 
      from ud 
      where sale.udid = ud.id
 );

SQLite 3.33 添加了对类似于 PostgreSQL 语法的 UPDATE + FROM 语法的支持:

update ud
  set assid = s.assid
from sale s 
where ud.id = s.udid;

主要问题:Update with Join in SQLite

关于sql - 如何在 SQL Server 中使用 JOIN 执行 UPDATE 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1293330/

相关文章:

sql - 表的增量更新

php - 使用数组键和值创建 sql select 语句

sql - 如何获得时间戳的平均值?数据库

mysql - 连接两个表时如何修复 FROM 不正确的语法错误?

sql-server - 重新调整层级 ID 值

sql - 使用CTE相互计算多列

sql-server - 批量插入文件路径作为存储过程参数

sql - 如何使用插入选择语句插入下一个最大值

sql - 我怎样才能批量更新这个?

mysql - 如何选择一组行的sum()和另一组的sum()