ORACLE 多表關聯 UPDATE 語句
阿新 • • 發佈:2019-01-27
-- 源表
CREATE
TABLE
test_from (id
INT
, val
VARCHAR
(20));
-- 目標表
CREATE
TABLE
test_to (id
INT
, val
VARCHAR
(20));
-- 插入源表
INSERT
INTO
test_from
VALUES
(1,
'A'
);
INSERT
INTO
test_from
VALUES
(2,
'B'
);
-- 合併 源表到目標表
MERGE
INTO
test_to
USING test_from
ON
( test_to.id = test_from.id )
-- 條件是 id 相同
WHEN
MATCHED
THEN
UPDATE
SET
test_to.val = test_from.val
-- 匹配的時候,更新
WHEN
NOT
MATCHED
THEN
INSERT
VALUES
(test_from.id, test_from.val)
-- 源表有,目標表沒有,插入
-- 第一次檢查 目標表資料.
SQL>
SELECT
*
FROM
test_to;
ID VAL
---------- --------------------
1 A
2 B
-- 更新源表
UPDATE
test_from
SET
val =
'A2'
WHERE
id = 1;
-- 刪除源表
DELETE
FROM
test_from
WHERE
id = 2;
-- 插入源表
INSERT
INTO
test_from
VALUES
(3,
'C'
);
-- 合併 源表到目標表
MERGE
INTO
test_to
USING test_from
ON
( test_to.id = test_from.id )
-- 條件是 id 相同
WHEN
MATCHED
THEN
UPDATE
SET
test_to.val = test_from.val
-- 匹配的時候,更新
WHEN
NOT
MATCHED
THEN
INSERT
VALUES
(test_from.id, test_from.val)
-- 源表有,目標表沒有,插入
-- 再次檢查 目標表資料.
SQL>
SELECT
*
FROM
test_to;
ID VAL
---------- --------------------
1 A2
2 B
3 C
我以前在做merge操作時也出現這個問題,因為在merge into 時需要一個唯一的key值來決定merge into的操作是insert into還是update,而我merge的臨時表中的key值不唯一,所以報這個錯誤了,解決辦法是將臨時表按照一定的規則先摟一遍全部資料並且key值唯一。 比如: select a.* from MERGE_TEST_TMP a where a.mid = (select max(MERGE_TEST_TMP.Mid) from MERGE_TEST_TMP where MERGE_TEST_TMP.MKEY=a.mkey) order by a.Mid desc;