【问题标题】:Oracle SQL-Updating Rows with Another Table KeyOracle SQL 使用另一个表键更新行
【发布时间】:2021-04-04 00:51:45
【问题描述】:

我正在使用 SQL 开发人员

我正在编写代码来更新几列。

我在两个表和部门列中有很多 ID 列。

我想更改表 1 的列值。

update table1 a
set a.key_ıd = (case 
                   when a.key_ıd = 1 then 101
                   when a.key_ıd = 2 then 102
                   .
                   .
                   else a.ıd 
                end)
from table1 a, table2 b
where a.ıd = b.ıd
  and b.key_ıd in (1, 2, ...)
  and b.type <> 2;

但是线路变红了,有什么建议吗?

命令行错误:5 列:1
错误报告 -
SQL 错误:ORA-00933:
00933. 00000 - “SQL 命令未正确结束”
*原因:
*行动:

我不明白为什么这段代码不起作用。

谢谢。

【问题讨论】:

    标签: sql oracle sql-update where-clause dml


    【解决方案1】:

    我想你想要exists:

    UPDATE table1 a
        SET a.key_ıd = (CASE WHEN a.key_ıd=1 THEN 101
                             WHEN a.key_ıd=2 THEN 102
                                           .
                                           .
                             ELSE a.ıd
                        END)
        WHERE EXISTS (SELECT 1
                      FROM table2 b
                      WHERE a.ıd = b.ıd AND
                            b.key_ıd IN (1,2,...) AND
                            b.type <> 2
                      );
    

    Oracle 不支持UPDATE 中的FROM 子句。设置新值的逻辑仅使用正在更新的表。因此,您只想过滤受影响的行。对于这个EXISTS 是一个合适的方法。

    【讨论】:

      【解决方案2】:

      一种选择是使用带有WHEN MATCHED 选项的MERGE 语句,例如

      MERGE INTO table1 t1
      USING ( SELECT *
                FROM table2 t ) t2
         ON ( t1.id = t2.id AND t2.type <> 2 AND t2.key_id IN (1,2...) )                 
       WHEN MATCHED THEN UPDATE SET t1.key_id = CASE WHEN t1.key_id = t2.key_id THEN
                                                          t1.key_id + 100
                                                     ELSE
                                                          t1.id
                                                      END 
      

      Demo

      • 与其他一些知名的 DBM 系统不同,Oracle DB 不支持 UPDATE .. SET ... FROM.. 语法
      • 不应将包含逗号分隔表的前联接语法 而是使用带有显式 JOIN 关键字的 SQL-92 语法 首选因为在需要 Join 语句时更易于使用

      【讨论】:

        猜你喜欢
        • 2011-10-25
        • 1970-01-01
        • 2015-01-29
        • 2021-09-17
        • 1970-01-01
        • 2018-07-01
        • 2020-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多