1. 程式人生 > >ORACLE 多表關聯 UPDATE 語句

ORACLE 多表關聯 UPDATE 語句

-- 源表 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
-----------------------------------------------------------------------
oracle 中報ora-30926 無法在源表中獲得穩定的行 是怎麼回事?
我以前在做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;