【问题标题】:How to use Update command with CASE statement in Oracle?如何在 Oracle 中使用带有 CASE 语句的更新命令?
【发布时间】:2020-05-14 18:36:35
【问题描述】:

我必须根据以下条件更新匹配标志列:

当 F_ZN=IC_ZN AND F_STN=IC_STN 然后 Matching Flag 将设置为 1 else 0 ,我可以想到这个,但我不知道确切的语法。

UPDATE F_STATE_MAPPING SET MATCHING_FLAG=CASE WHEN F_ZN=IC_ZN AND F_STN=IC_STN THEN 1 ELSE 0 END  
FROM 
(
SELECT F_ZN,F_STN,IC_ZN,IC_STN FROM 
(
SELECT A.ZN_CD AS F_ZN,A.STN AS F_STN,B.ZN_CD AS IC_ZN,B.STN AS IC_STN FROM 
F_STATE_MAPPING A,TEMP_STN_STATE_MAPPING B WHERE A.ZN_CD=B.ZN_CD AND A.STN=B.STN
)
)

F_STATE_MAPPING 表的架构是

    ZN_CD VARCHAR2(4)
    STN   VARCHAR2(4) 
MATCHING_FLAG NUMBER(1)

请指导。

【问题讨论】:

  • 这是一个case 表达式,它返回一个值。
  • 是的,所以 Matching_Flag 必须更新为 0 或 1 的值。
  • 总是帮助提供创建表语句和插入语句作为问题的一部分。这确实有助于其他人回答您的问题。
  • 样本数据和期望的结果会有所帮助,就像知道哪些列来自哪个表一样。

标签: sql oracle plsql


【解决方案1】:

你要不要使用exists

UPDATE F_STATE_MAPPING
    SET MATCHING_FLAG = (CASE WHEN EXISTS (SELECT 1
                                           FROM TEMP_STN_STATE_MAPPING
                                           WHERE F_ZN = IC_ZN AND F_STN = IC_STN
                                          )
                              THEN 1 ELSE 0
                         END) ;

【讨论】:

    【解决方案2】:

    如果要更新表的列,它必须首先存在:

    ALTER TABLE F_STATE_MAPPING ADD  MATCHING_FLAG int
    

    那你就可以更新了

    UPDATE 
    (
        SELECT A.MATCHING_FLAG,
                CASE WHEN (A.ZN_CD=B.ZN_CD AND A.STN=B.STN) THEN 1 ELSE 0 END AS NEWVALUE
        FROM F_STATE_MAPPING A 
        LEFT JOIN TEMP_STN_STATE_MAPPING B ON A.ZN_CD=B.ZN_CD AND A.STN=B.STN
    ) t
    SET t.MATCHING_FLAG = t.NEWVALUE
    

    也可以写成:

     UPDATE 
        (
            SELECT A.MATCHING_FLAG,
                    CASE WHEN (B.ZN_CD is null) THEN 0 ELSE 1 END AS NEWVALUE
            FROM F_STATE_MAPPING A 
            LEFT JOIN TEMP_STN_STATE_MAPPING B ON A.ZN_CD=B.ZN_CD AND A.STN=B.STN
        ) t
        SET t.MATCHING_FLAG = t.NEWVALUE
    

    【讨论】:

    • 我收到 SQL 错误:ORA-01779:无法修改映射到非键保留表 01779 的列。00000 -“无法修改映射到非键保留表的列” *原因:试图插入或更新映射到非键保留表的连接视图的列。 *Action:直接修改底层基表。
    • 您正在更新视图,请回复如何纠正错误
    猜你喜欢
    • 2017-03-13
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多