我需要在SQL Server中使用"父"表中的数据更新此表,请参见以下内容:

Table: sale

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

Table: ud

id  (int)
assid  (int)

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

什么查询可以做到这一点?我在考虑join分,但我不确定是否可能.

推荐答案

语法严格取决于您使用的SQL DBMS.以下是一些在ANSI/ISO(aka应该适用于任何SQL DBMS)、MySQL、SQL Server和Oracle中实现这一点的方法.请注意,我建议的ANSI/ISO方法通常比其他两种方法慢得多,但如果您使用的是SQL DBMS,而不是MySQL、SQL Server或Oracle,那么这可能是唯一的方法(例如,如果您的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 Server:

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子句中重复.

神谕:

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
 );

Sql相关问答推荐

神秘的日期转换

将SEMI JOIN、ANTI JOIN转换为非连接SQL

Select /过滤postgr中的树 struct

将有界时间周期作为阶跃函数,其中周期开始返回1,周期结束返回0

如何从上一个值减go 值

如何转换和汇总行数

Access VBA SQL命令INSERT FOR MULTIME VALUE

如何将`now()`作为SQL插入语句的一部分?

在MS Access Modern图表的X轴上显示时间值时遇到问题

如何计算给定日期前三个月的值以及月初数据?

Oracle分层查询-两条路径在末尾合并为一条

需要从键-值对数据中提取值

使用 SQL 将列添加到 Access 数据库时出错

删除对 JSON 数据的未解析引用的 SQL71502 警告

删除重复记录但保留最新的SQL查询

如何使用SQL将患者平均分配给他们所在地区的doctor

MariaDB非常简单的MATCHAGAINST查询不使用FULLTEXT索引吗?

计数时如何为所有时间间隔返回 0 而不是什么都不返回

在 SQL 中使用循环遍历按时间顺序排列的数据

使用SQL中另一个表的查询结果在表中查找记录