2015-06-19 55 views
1

我正在使用合併語句合併兩個表,其中源表中的一行可能會更新目標表中的多行。PL/SQL - 從源表中的一行更新目標表中的多個行

它去有點像這樣

MERGE TABLE1 A 
USING (SELECT EMP_CODE, DAYS_OFF FROM TABLE2) B 
ON (A.ID = B.EMP_CODE) 
WHEN MATCHED THEN 
UPDATE SET A.DAYS_OFF = B.DAYS_OFF; 

然而,當我嘗試,我得到SQL Error: ORA-30926: unable to get a stable set of rows in the source tables

有沒有其他辦法可以做到這一點?

+0

向我們展示你的完整的存儲過程@jWeaver我面對一個比你提到的後一個不同的問題 –

+0

。我的問題是,我不能確保ON(A.ID = B.EMP_CODE)只返回一行。 – DylanW80

+0

你能分享你的兩張表的樣本數據嗎? – Ravi

回答

0

i get SQL Error: ORA-30926: unable to get a stable set of rows in the source tables

因爲,你的源表可能包含重複的值。

您可能需要再添加一列來唯一標識每一行。

CREATE TABLE source_table (
    col1 NUMBER, 
    col2 VARCHAR2(10), 
    col3 VARCHAR2(10) 
); 

INSERT INTO source_table (col1, col2, col3) VALUES (1, 'a', 'w'); 
INSERT INTO source_table (col1, col2, col3) VALUES (1, 'b', 'x'); 
INSERT INTO source_table (col1, col2, col3) VALUES (2, 'c', 'y'); 
INSERT INTO source_table (col1, col2, col3) VALUES (3, 'c', 'z'); 

COMMIT; 

CREATE TABLE target_table (
    col1 NUMBER, 
    col2 VARCHAR2(10), 
    col3 VARCHAR2(10) 
); 

INSERT INTO target_table (col1, col2, col3) VALUES (1, 'b', 'z'); 
INSERT INTO target_table (col1, col2, col3) VALUES (3, 'd', 'w'); 

COMMIT; 

現在我們要合併兩個表。

MERGE INTO target_table trg 
USING (--Actually we can simply write source_table for this example but I want to write Select:) 
     SELECT col1, col2, col3 
     FROM source_table 
    ) src 
ON (trg.col1 = src.col1) 
WHEN MATCHED THEN UPDATE SET --Don't forget you cannot update columns that included in ON clause 
    trg.col2 = src.col2, 
    trg.col3 = src.col3 
WHEN NOT MATCHED THEN INSERT 
    (
     col1, 
     col2, 
     col3 
    ) 
    VALUES 
    (
     src.col1, 
     src.col2, 
     src.col3 
    ); 

COMMIT; 

解決方案

MERGE INTO target_table trg 
USING source_table src --Now I simply write the table name:) 
ON (
    trg.col1 = src.col1 AND 
    trg.col2 = src.col2 
    ) 
WHEN MATCHED THEN UPDATE SET --Don't forget you cannot update columns that included in ON clause 
    trg.col3 = src.col3 
WHEN NOT MATCHED THEN INSERT 
    (
     col1, 
     col2, 
     col3 
    ) 
    VALUES 
    (
     src.col1, 
     src.col2, 
     src.col3 
    ); 

COMMIT; 

Read more

1

這個錯誤意味着Oracle無法獲得A中的每條記錄,這是一組只與這條記錄匹配的記錄(例如導致多對多關係的一組記錄)。

你需要做的是在目標表檢查與相同的「ID」重複項目的

SQL> list     
    1 MERGE INTO TABLE1 A 
    2 USING (SELECT * FROM TABLE2) B 
    3 ON (A.ID = B.EMP_CODE) 
    4 WHEN MATCHED THEN 
    5 UPDATE SET A.DAYS_OFF = B.DAYS_OFF 
    6* 
SQL> r 
    1 MERGE INTO TABLE1 A 
    2 USING (SELECT * FROM TABLE2) B 
    3 ON (A.ID = B.EMP_CODE) 
    4 WHEN MATCHED THEN 
    5 UPDATE SET A.DAYS_OFF = B.DAYS_OFF 
    6* 
MERGE INTO TABLE1 A 
* 
ERROR at line 1: 
ORA-30926: unable to get a stable set of rows in the source tables 

SQL> select id, count(0) from table1 group by id; 

     ID COUNT(0) 
---------- ---------- 
     1   2 

SQL> delete from table1 t1 where t1.rowid not in (select max(rowid) from table1 t2 where t2.id = t1.id); 

1 row deleted. 

SQL> commit; 

Commit complete. 

SQL> MERGE INTO TABLE1 A 
USING (SELECT * FROM TABLE2) B 
ON (A.ID = B.EMP_CODE) 
WHEN MATCHED THEN 
UPDATE SET A.DAYS_OFF = B.DAYS_OFF 2 3 4 5 ; 

2 rows merged. 

SQL> commit; 

Commit complete. 
相關問題