【问题标题】:Update a column in table A based on values in table B using a CASE statement使用 CASE 语句根据表 B 中的值更新表 A 中的列
【发布时间】:2020-02-19 12:24:57
【问题描述】:

我有一个棘手的问题。

我将有一个表A,它由两列A.IDA.Cat1_Avail 组成。 Cat1_Avail-列目前为空。

我想根据一个逻辑问题更新A.Cat1Avail 中的值。 特别是,我有另一个表B,它由B.IDB.Feature 组成。 B.Feature 可以保存以下值:Cat1Cat2NULL

对于匹配 ID,我想在 A.Cat1_Avail 中插入一个 1,因为表 B 中的匹配记录在 B.Feature 中包含值 Cat1。在Cat2 的情况下,A.Cat1_Avail 应为 0。

总之,我想根据逻辑问题更新一列(ID是否匹配?B.Feature的内容是什么?)。

我希望这能让事情变得清晰,不要太具体。

我想这个问题可以通过依次使用几个命令来解决。但我想要一个可以处理这个问题的命令。

【问题讨论】:

  • 使用触发器,保证数据的一致性。
  • 如果表A 有两列,那么A.Feature 是什么?我不关注这个问题。这就是样本数据和所需结果的原因(因为文本表非常有用!
  • 我的错。我更新了问题 - A.Feature 实际上是 A.Cat1Avail。
  • 我建议查看这个问题。因为它看起来“相似”并且讨论了一些非常好的想法(包括为什么不使用触发器;))stackoverflow.com/questions/21110669/…

标签: sql oracle


【解决方案1】:

请尝试一下

Update a
set 
a.Cat1Avail = (case WHEN b.Feature = 'cat1' THEN 1
                    WHEN b.Feature ='cat2' THEN 0
                    ELSE NULL End)
from A a 
join B b
on a.ID= b.ID

【讨论】:

    【解决方案2】:

    更新声明!

    UPDATE testa set testa.lvalue = (case when testb.lvalue = 'cat1' then 1 
                                            when testb.lvalue = 'cat2' then 0
                                            else null end)
        FROM testa join testb on (testa.id = testb.id)
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
    【解决方案3】:

    使用合并实现如下:

    MERGE INTO TABLEA A USING (
                                  SELECT
                                      ID,
                                      CASE FEATURE
                                          WHEN 'cat1'   THEN 1
                                          WHEN 'cat2'   THEN 0
                                      END AS CAT
                                  FROM
                                      TABLEB
                              ) B ON ( A.ID = B.ID )
    WHEN MATCHED THEN 
    UPDATE SET A.CAT1_AVAIL = B.CAT
    

    干杯!!

    【讨论】:

    • 这个效果很好。不知道您可以在 MERGE 命令中插入案例和连接:)
    猜你喜欢
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多