从sql中的另一个表更新

Posted

技术标签:

【中文标题】从sql中的另一个表更新【英文标题】:update from another table in sql 【发布时间】:2022-01-18 01:29:14 【问题描述】:

我有两张桌子。我需要根据where 子句将数据从一个表带到另一个表。

UPDATE cats_new c
SET c.INFO_REQ = (select min(w.tRANSITION_DATE) from CATS_new_history w)
where  w.CANDIDATEID = c.CANDIDATE_ID

【问题讨论】:

【参考方案1】:

我能想到的两个选项;一个遵循 JNevill 的建议和另一条建议:包括 where 子句以限制将被更新的行,因为 - 如果子查询中没有匹配项 - 您会将这些行的值更新为 NULL。这就是EXISTS 部分查询处理的内容:

update cats_new c set
  c.info_req = (select min(w.transition_date)
                from cats_new_history w
                where w.candidateid = c.candidate_id
               )
  where exists (select null
                from cats_new_history a
                where a.candidateid = c.candidate_id
               );
               

另一个选项是merge;尽管它通常用于“替换” upsert 操作(update AND insert),但如果您仅将其用于其中之一也没问题 - 在这种情况下为 update;它的on 子句处理哪些行会受到影响:

merge into cats_new c
  using (select w.candidateid, 
                min(w.transition_date) transition_date
         from cats_new_history w
         group by w.candidateid
        ) x
  on (c.candidate_id = x.candidateid)
when matched then update set
  c.info_req = x.transition_date;

【讨论】:

【参考方案2】:

这很接近,但您必须将 WHERE 条件移动到子查询中,以便子查询是“相关的”:

UPDATE cats_new c
SET c.INFO_REQ = 
  (
     SELECT min(w.tRANSITION_DATE) 
     FROM CATS_new_history w
     WHERE w.CANDIDATEID = c.CANDIDATE_ID
  )

您可以查看更多示例here。特别是第一个示例标记为“示例 - 使用另一个表中的数据更新表”

【讨论】:

以上是关于从sql中的另一个表更新的主要内容,如果未能解决你的问题,请参考以下文章

SQL 从另一个表中的另一列更新一列

如果数据是从表中更新的,则应将数据插入到 SQL Server 2017 中的另一个表中

如何使用另一个表中的另一列更新一列? SQL 错误:ORA-00933:SQL 命令未正确结束

一个触发器会激活 SQL Server 中的另一个触发器吗?

如何从 PostgreSQL 中的另一个表中更新具有随机 id 的表

使用其他行的数据更新同一表中的行 SQL