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

时间:2016-01-12 20:27:57

标签: sql oracle plsql query-optimization on-duplicate-key

我正在尝试编写一个条件查询,该查询根据另一个表中的数据将新行插入到表中,但如果该行已经存在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查询。

2 个答案:

答案 0 :(得分:1)

感谢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);

答案 1 :(得分:0)

  

如果你有,可以使用替代MERGE的另一种选择   ORACLE 11或更高版本。我们有一些来自oracle 11g的具体提示   以后用于忽略唯一INDEX上的重复值。   下面的代码段是一个非常小但是描述性的例子,你可以   希望这有助于。

-- 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.
  

由于我们有10个重复的键值,因此忽略了dup值   并且只插入了2个唯一值。