【问题标题】:SQL Update using value from join table使用连接表中的值进行 SQL 更新
【发布时间】:2014-07-30 11:57:45
【问题描述】:

我尝试使用此 sql 从表中已存在的值更新表中的新列。

 update "PROMOTION" t1  
      set "OFFER_CHAIN_ID" = poc."OFFER_CHAIN_ID"
 from "PROMOTION_OFFER_CHAIN" poc 
     inner join "PROMOTION" on "PROMOTION"."ID" = poc."PROMOTION_ID"

发生的情况是连接的第一个值被复制到所有后续条目中。关于两个表。原始表具有唯一值,更新列中的所有值都相同。

最终我改用了这个 SQL。

update "PROMOTION" t1
    set "OFFER_CHAIN_ID" = poc."OFFER_CHAIN_ID"
from "PROMOTION_OFFER_CHAIN" poc
where 
    t1."ID" = poc."PROMOTION_ID"

此更新有效并复制了所有数据,原始表中的 1000 个唯一元素,更新后的表中的 1000 个唯一元素。

这是一个错误,还是预期的结果?

【问题讨论】:

  • 在进行此类更新之前,通常明智的做法是先运行类似的选择查询以查看可能的结果。

标签: sql join sql-update


【解决方案1】:

SQL 行为正确。您的原始查询是:

 update "PROMOTION" t1 
 --------^ 
      set "OFFER_CHAIN_ID" = poc."OFFER_CHAIN_ID"
      from "PROMOTION_OFFER_CHAIN" poc inner join
           "PROMOTION"
 -----------^
           on "PROMOTION"."ID" = poc."PROMOTION_ID"

请注意,表PROMOTION 被提及两次。不好。所以,join 发生了,产生了很多行。那么与t1版本的表没有关联。

你没有提到你正在使用的数据库。在 SQL Server 中,您只需:

 update p  
      set "OFFER_CHAIN_ID" = poc."OFFER_CHAIN_ID"
      from "PROMOTION_OFFER_CHAIN" poc inner join
           "PROMOTION" p
           on p."ID" = poc."PROMOTION_ID";

注意 aliasupdate 之后使用(如果没有别名,则使用表名)。现在该表只被提及一次,因此update 应该按预期运行。

【讨论】:

  • 好的,所以我尝试了您的建议,但没有成功。我得到的错误是:错误:关系“p”不存在。第 1 行:更新页面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-14
  • 2021-06-07
  • 2011-05-05
相关资源
最近更新 更多