Sql 如何使用CASE表达式使用内部查询更新表

Sql 如何使用CASE表达式使用内部查询更新表,sql,oracle,Sql,Oracle,我使用了以下更新查询: UPDATE datA_table T SET T.VALUE= (SELECT CASE WHEN t3.h1 =(t3.h2) and t3.h1=(t3.h3) THEN t3.h1 ELSE Case wHEN T3.h1 < > T3.h2 THEN T3.h2 ELSE cASE wHEN T3.h1

我使用了以下更新查询:

UPDATE datA_table T
SET T.VALUE=
  (SELECT   
      CASE 
         WHEN t3.h1 =(t3.h2) and t3.h1=(t3.h3) THEN t3.h1
         ELSE 
    Case
    wHEN T3.h1 < > T3.h2 THEN T3.h2
        ELSE
            cASE
                wHEN T3.h1 < > T3.h3 THEN T3.h3
            eND
    eND
      END 
      from datA_table t3)T1
where t.time=t1.time and t.name=t1.name
但这会产生以下错误:

错误报告-SQL错误:ORA-00933:SQL命令未正确结束 93300000-SQL命令未正确结束


有什么方法可以解决这个问题吗?

在每种情况下,您都可以使用许多WHEN,这也可能比嵌套的情况执行得更好。我不熟悉您将更新的表与subselect链接的方式。通常,您不能从外部引用子查询中的内部别名,也不知道它是否有效,因此我以我确信有效的方式对其进行了编码:

UPDATE datA_table T
SET T.VALUE=
  (SELECT   
      CASE 
         WHEN t3.h1 =(t3.h2) and t3.h1=(t3.h3) THEN t3.h1
         WHEN T3.h1 < > T3.h2 THEN T3.h2
         wHEN T3.h1 < > T3.h3 THEN T3.h3
      END
      from datA_table t3
      where t.id=t3.id AND T.name=T3.name
  )
where <your condition for datA_table rows to be updated>
使现代化 我刚刚注意到被修改的表和子查询中的表都是同一个表,连接条件可能是一个键。因此,根本不需要指定子查询。以下更简单的更新也可以做到这一点,但可能要快得多。我还改进了案例逻辑,因为第一次测试是多余的:

UPDATE datA_table
SET VALUE = CASE 
              WHEN h1 <> h2 THEN h2
              WHEN h1 <> h3 THEN h3
              ELSE h1
            END
WHERE <your condition for rows to be updated>

语法不正确。结束SELECT的括号后的所有内容都应省略。 子选择将取代中的


@user2864740我计算3个大小写,3个以OP的代码结尾。这是否会更新所有行,而不考虑名称和id?@t-clausen.dk dependa取决于您不能在子选择外部使用条件。该条件从子选择内部与数据表连接
UPDATE data_table SET value = <expression>
CASE WHEN <condition1>
     THEN <expression1>
     WHEN <condition2>
     THEN <expression2>
     ...
     ELSE <expression>
END