2016-02-10 41 views
0

我想用插入和更新的sql語句。先插入,然後用SQL語句更新表格

我的表如下:

|c1|c2|c3|c4|c5 
|1 2 a b c 
|1 3 e f g 

C3,C4,C5可以有不同的值。該行可以與C1和C2列組合使用。我需要能夠檢查第一行是否與值c1,c2不存在然後插入數據。如果c1,c2已經具有例如(1,2)的值並且如果數據以c1,c2的相同值返回,則使用最新值更新c3,c4,c5。

我嘗試使用下面的查詢

INSERT INTO t1 (c1,c2,c3,c4,c5) 
VALUES ('1','2','a','b','c') 
ON DUPLICATE KEY 
UPDATE c3='e',c4 = 'f',c5='g'; 

我得到一個ORA錯誤如下 SQL命令沒有結束正常(ORA-00933)從鷺

響應後


更新

MERGE INTO table1 t 使用(選擇'000004'作爲SENDER,'Receiver'作爲RECEIVER,'1030'作爲IDENTIFIER,'2016'作爲CREATI (t.SENDER = s.SENDER和t.IDENTIFIER = s.IDENTIFIER) 當匹配時,則更新設置t.CREATIONDATEANDTIME ='1213',ONDATEANDTIME,'2'爲ACKCODE,'測試'爲來自表1的ACKDESCRIPTION) ON 't'RECEIVER ='hello' WHEN NOT MATCHED THEN INSERT(t.SENDER,t.RECEIVER,t.IDENTIFIER,t.CREATIONDATEANDTIME,t.ACKCODE,t.ACKDESCRIPTION) VALUES(s.SENDER,s.RECEIVER,s .IDENTIFIER,s.CREATIONDATEANDTIME,s.ACKCODE,s.ACKDESCRIPTION)

輸出查詢: 方案1:當沒有數據相匹配的條件(t.SENDER = s.SENDER和t.IDENTIFIER = S。 IDENTIFIER),我得到如下錯誤 ORA-30926:無法在源表中獲得穩定的行集。
原因:由於dml活動較大或where子句中存在非確定性活動,無法獲得穩定的一組行。
操作:刪除任何非確定性where子句並重新發出DML

方案2:當有數據相匹配的條件(t.SENDER = s.SENDER和t.IDENTIFIER = s.IDENTIFIER)然後在表中,我可以看到5個新條目。

您能否請幫助。

+1

看起來像一個Oracle錯誤信息不是mysql ?! – Jens

+0

oracle可能擁有mysql,但這並不意味着oracle RDBMS會突然啓動支持mysql特定的sql擴展...... –

+0

這被標記爲Mysql,但是你有一個Oracle錯誤。你實際使用哪個數據庫? – HLGEM

回答

1

您可以使用MERGE語句是這樣的:

MERGE INTO t1 t 
USING(select '1' as c1,'2' c2 ,'a' as c3,'b' as c4,'c' as c5 from dual) s 
ON(t.c1 = s.c1 and t.c2 = s.c2) 
WHEN MATCHED THEN UPDATE SET t.c3 = '1213',t.c4 = 'test' 
WHEN NOT MATCHED THEN INSERT (t.c1,t.c2,t.c3,t.c4,t.c5) 
VALUES (S.c1,s.c2,s.c3,s.c4,s.c5) 

這基本上執行UPSERT,更新其他插件。它會檢查值是否存在,如果存在 - 更新/刪除它們(調整爲代碼以執行所需操作),如果沒有,則插入它們。

+0

MERGE INTO t1 t 使用(選擇'1'爲c1,'2'爲c2,'a'爲c3,'b'爲c4,'c'爲c5)s ON(t.c1 = s.c1和t.c2 = s.c2) 當匹配,然後更新設置t.c3 ='1213'和t.c4 ='測試' 當不匹配然後插入(t.c1,t.c2,t.c3,t .c4,t.c5) VALUES(s.c1,s.c2,s.c3,s.c4,s.c5)----------->我得到一個ORA錯誤:FROM在預期的地方找不到關鍵字ORA-00923 – user3384231

+0

@ user3384231我的不好,編輯答案。在USING()部分中錯過了DUAL。 :)現在會工作。 – sagi

+0

我可不可以使用相同的t1表嗎?根據要求..我不應該使用雙表 – user3384231

0

合併成表1 T使用(選擇不同 '000004' 作爲SENDER, '接收器' 爲RECEIVER, '1030' 作爲IDENTIFIER, '2016' 作爲CREATIONDATEANDTIME, '2' 作爲ACKCODE, '測試' 作爲從ACKDESCRIPTION table1)s ON(t.SENDER = s.SENDER和t.IDENTIFIER = s.IDENTIFIER)當匹配UPDATE SET時t.CREATIONDATEANDTIME ='1213',t.RECEIVER ='hello'當不匹配然後INSERT(t.SENDER ,t.RECEIVER,t.IDENTIFIER,t.CREATIONDATEANDTIME,t.ACKCODE,t.ACKDESCRIPTION)VALUES(s.SENDER,s.RECEIVER,s.IDENTIFIER,s.CREATIONDATEANDTIME,s.ACKCODE,s.ACKDESCRIPTION)

在我的查詢中添加了不同的子句,它工作正常。感謝所有回覆我的帖子和指導我。