我对 SQL 还很陌生,很难弄清楚如何在 Oracle Apex 中更新和插入一个表到另一个表(使用 SQL)。
这两个表分别命名为 Temp 和 Table(示例),并且都具有相同的列。基本上它们是彼此的副本,但具有不同的数据。我想将 Temp 中的 ID 字段与 Table 中的 ID 字段进行比较,如果有一行与 Temp 中的 ID 字段匹配,则用 Temp 中相应行中的数据覆盖 Table 中该行上的所有数据.
注意:Table 有 1000 万行数据,Temp 有 500 行左右。
if Temp.ID = Table.ID then
update
set
Table.ID = Temp.ID
Table.Address = Temp.Address
else
insert
(Table.ID,
Table.Address)
values
(Temp.ID,
Temp.Address
这基本上就是我想要做的,但不知道如何用 SQL 编写它。已经看到了很多不同的答案,但没有一个真正涉及 2 个表,并且主要针对 MySQL 或 SQL Server 特定的 SQL,我不确定这些 SQL 是否也适用于 Oracle。
MERGE into TEST1
USING TEST2 on (TEST2.ID = TEST1.ID)
WHEN matched THEN UPDATE
SET TEST1.ID = TEST2.ID, TEST1.NAME = TEST2.NAME, TEST1.ADDRESS = TEST2.ADDRESS, TEST1.EMAIL = TEST2.EMAIL
WHEN not matched THEN INSERT (ID, NAME, ADDRESS, EMAIL) values (TEST2.ID, TEST2.NAME, TEST2.ADDRESS, TEST2.EMAIL);
我尝试了这个,但它给了我错误:
ORA-38104: Columns referenced in the ON Clause cannot be updated: "TEST1"."ID"
更新:开始工作了! http://db-oriented.com/2013/09/20/the-merge-statement/
对错误的答案很有帮助,我不知道你不能在更新子句中拥有 ID,这现在完全有意义了。也感谢下面的答主给我解释了合并代码。 :)
最佳答案
看起来很适合MERGE
。看一下示例。
示例表格和数据:
SQL> create table ttable (id number, address varchar2(20));
Table created.
SQL> create table temp (id number, address varchar2(20));
Table created.
SQL> insert into ttable
2 select 1, 'Address 1' from dual union all
3 select 2, 'Address 2' from dual union all
4 select 3, 'Address 3' from dual;
3 rows created.
SQL> insert into temp
2 select 1, 'New address 1' from dual union all
3 select 2, 'New address 2' from dual union all
4 select 4, 'New address 4' from dual;
3 rows created.
合并并结果:
SQL> merge into ttable a
2 using temp e on (e.id = a.id)
3 when matched then update set a.address = e.address
4 when not matched then insert (id, address) values (e.id, e.address);
3 rows merged.
SQL> select * from ttable;
ID ADDRESS
---------- --------------------
1 New address 1
2 New address 2
3 Address 3
4 New address 4
SQL>
关于sql - 对 2 个表使用插入/更新 - Oracle Apex,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57417084/