简体   繁体   English

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

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

I am using SQL developer我正在使用 SQL 开发人员

I am writing code to update several columns.我正在编写代码来更新几列。

I have many ID column in two tables and department columns.我在两个表和部门列中有很多 ID 列。

I want to change table 1 columns value.我想更改表 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;

But from line getting red, any suggestions?但是从线路变红,有什么建议吗?

Error at Command Line: 5 Column: 1命令行错误:5 列:1
Error report -错误报告 -
SQL Error: ORA-00933: SQL 错误:ORA-00933:
00933. 00000 - "SQL command not properly ended" 00933. 00000 - “SQL 命令未正确结束”
*Cause: *原因:
*Action: *行动:

I don't understand why this code doesn't work.我不明白为什么这段代码不起作用。

Thanks.谢谢。

I think you want exists :我想你想要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 doesn't support a FROM clause in UPDATE . Oracle 不支持UPDATE中的FROM子句。 And the logic for setting the new values only uses the table being updated.设置新值的逻辑仅使用正在更新的表。 So, you just want to filter the rows that are affected.因此,您只想过滤受影响的行。 For this EXISTS is a suitable approach.对于这个EXISTS是一种合适的方法。

One option would be using a MERGE Statement with WHEN MATCHED option such as一种选择是使用带有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 演示

  • UPDATE.. SET... FROM.. syntax is not supported within Oracle DB unlike to some other well-known DBM Systems UPDATE.. SET... FROM..语法在 Oracle DB 中不受支持,这与其他一些知名的 DBM 系统不同
  • The former Join syntax containing comma-seperated tables shouldn't be used rather the SQL-92 syntax with explicit JOIN keywords should be preferred as being easier to use whenever a Join statement is needed不应使用包含逗号分隔表的以前的 Join 语法,而应首选带有显式JOIN关键字的 SQL-92 语法,因为在需要 Join 语句时更容易使用

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

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