sql - 对 2 个表使用插入/更新 - Oracle Apex

标签 sql database oracle insert oracle-apex

我对 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/

相关文章:

SQL变量,怎么做?

mysql - Insert..Select into InnoDB table with commit after every insert?

mysql - sql查询删除除主键之外的所有属性

mysql - 我正在尝试使用 INNER JOIN 将 4 个表链接在一起

database - 如何在 JULIA 中使用 writecsv/writedlm 写入带标题的输出

database - BLOB 存储 - 100+ GB、MySQL、SQLite 或 PostgreSQL + Python

c# - Oracle:算术运算导致溢出

sql - 是否可以在从 2 个表创建的复杂 View 中插入新行?

java - 使用 JDBC 以用户定义的记录作为其 IN 参数调用 PL/SQL 过程

sql - 数据库设计 - 重写值