如何将数据从另一个 table 插入到 table 中,可能存在重复键

How to insert data into a table from another table with the possibility of duplicate keys

我正在尝试编写一个条件查询,从另一个 table 的数据中将新行插入 table,但如果该行的 PK 已经存在,则改为更新它。我遇到了 ON DUPLICATE KEY UPDATE,但只能找到使用插入值的示例,而不是从内部 select 语句获得的数据。这是一个例子来说明我在说什么:

INSERT INTO SCHEMA1.TABLE1 T1
  (T1.ID,
   T1.COLUMN1,
   T1.COLUMN2)
SELECT T2.ID,
       T2.COLUMN1,
       T2.COLUMN2
FROM SCHEMA2.TABLE2 T2
WHERE T2.COLUMN3 = ?)
ON DUPLICATE KEY UPDATE T1.COLUMN1 = T2.COLUMN1;

由于某种原因,上面的语法不起作用。我唯一可以从 Oracle 文档中收集到的是 ON DUPLICATE KEY UPDATE 只能与 VALUES 一起使用——而不是嵌套的 SELECT 查询。

感谢 mustaccio 和 Alex Poole,这是解决方案:

MERGE INTO SCHEMA1.TABLE1 T1 USING
(SELECT ID,
   COLUMN1,
   COLUMN2
 FROM SCHEMA2.TABLE2
 WHERE COLUMN3 = ?) T2
ON (T1.ID = T2.ID)
WHEN MATCHED THEN UPDATE SET
  T1.COLUMN1 = T2.COLUMN1,
  T1.COLUMN2 = T2.COLUMN2
WHEN NOT MATCHED THEN INSERT (
  T1.ID,
  T1.COLUMN1,
  T1.COLUMN2
VALUES (
  T2.ID,
  T2.COLUMN1,
  T2.COLUMN2);

Just an alternative whcih you can use instead of MERGE if you have ORACLE version 11 or more. We have some specific HINTS from oracle 11g onwards which are used to ignore duplicate values on unique INDEX. Below snippet is a very small but descriptive example which you can incorporate hope this helps.

-- Table creation with Primary key as SR_NO
CREATE TABLE DUP_CHECK_KEY
(
SR_NO NUMBER PRIMARY KEY,
NAME VARCHAR2(100 CHAR)
);

Table created

-- Inserting random data in the first go
INSERT INTO DUP_CHECK_KEY
SELECT LEVEL,LEVEL||'Av' FROM dual 
CONNECT BY level < 10;

10 rows inserted.

--Again inserting same data with 2 more unique rows to be inserted.
INSERT /*+ ignore_row_on_dupkey_index(DUP_CHECK_KEY,SYS_C00145520) */ INTO DUP_CHECK_KEY
SELECT LEVEL,LEVEL||'Av' FROM dual 
CONNECT BY level < 12;

2 rows inserted.

Since we have 10 duplicate key values it has ignored the dup values and inserted only 2 unique values.