替换更新左连接语句中的缺失值

Posted

技术标签:

【中文标题】替换更新左连接语句中的缺失值【英文标题】:replace missing value in update left join statement 【发布时间】:2019-07-25 11:00:05 【问题描述】:

我使用更新左连接语句更新了现有表,如下所示:

UPDATE A
SET  A.SPSS_FieldForce = B.Remarks
FROM FBL1IN_working as A
left JOIN remarks_master_data as B 
    ON A.Vendor = B.Vendor_Code;

但是,我需要将 SPSS_FieldForce 列中的 NULL 值替换为“Non SPSS / FFV”值。目前,我正在使用另一个语句执行此操作,如下所示:

UPDATE
  FBL1IN_working
SET
  SPSS_FieldForce = 'Non SPSS/ FFV'
WHERE
  SPSS_FieldForce IS NULL;

这可以完成工作,但我想将这两个不同的语句合并为一个。我确信有一种方法可以替换第一个更新左连接语句中的缺失值,但我只是不知道如何完成它。

【问题讨论】:

您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tag 【参考方案1】:

好像是sqlserver语法吧? 那么

UPDATE A 
SET A.SPSS_FieldForce = WHEN B.Vendor_Code IS NULL THEN 'Non SPSS / FFV' ELSE B.Remarks END
FROM FBL1IN_working as A 
     LEFT JOIN remarks_master_data as B ON A.Vendor = B.Vendor_Code;

将 B.Vendor_Code 设置为 NULL 意味着您的 B 表中缺少该记录

【讨论】:

【参考方案2】:

使用COALESCE():

UPDATE w
    SET  SPSS_FieldForce = COALESCE(rmd.Remarks, 'Non SPSS/ FFV')
    FROM FBL1IN_working w LEFT JOIN
         remarks_master_data rmd
         ON w.Vendor = rmd.Vendor_Code;

请注意,我还更改了表别名,使其有意义 -- 表名的缩写。任意字母会使查询更难阅读。

【讨论】:

COALESCE 可能不是正确的解决方案:如果remarks_master_data 表中有匹配的记录,其字段Remarksnull,您将在@ 中写入'Non SPSS/FFV' 987654326@ 表。如果Remarks 不能为空,那么 COALESCE 是正确的解决方案。 @OlivierDepriester 。 . .所有NULL 值都被问题中的第二个UPDATE 替换。 @Gordon Linoff:我看到了,但我想知道它是否已经是现有代码中的错误;)。其实我同意你的看法:如果预期结果如问题中所述,COALESCE 是最好的解决方案【参考方案3】:
UPDATE A SET
  A.SPSS_FieldForce = ISNULL( B.Remarks, 'Non SPSS/ FFV') 
FROM FBL1IN_working as A
left JOIN remarks_master_data as B ON A.Vendor = B.Vendor_Code;

【讨论】:

以上是关于替换更新左连接语句中的缺失值的主要内容,如果未能解决你的问题,请参考以下文章

如何用相邻值替换数据框中的 NA(缺失值)

用计算值替换缺失值

R语言缺失值替换:缺失的值(NA)替换每个分组最近的非缺失值

用序列中的缺失值替换 NA (R)

将 pandas 列中的值替换为缺失键的默认值

如何用python中的方程替换数据框中的缺失值