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