繁体   English   中英

Oracle SQL 使用另一个表键更新行

[英]Oracle SQL-Updating Rows with Another Table Key

我正在使用 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 命令未正确结束”
*原因:
*行动:

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

谢谢。

我想你想要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是一种合适的方法。

一种选择是使用带有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 

演示

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM