首先插入然后使用SQL语句更新表

时间:2016-02-10 14:09:34

标签: sql oracle

我正在尝试使用insert和update 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)

来自sagi的回复后更新

MERGE INTO table1 t 使用(选择' 000004'作为发送者,'接收者'作为接收者,' 1030'作为IDENTIFIER,' 2016'作为CREATIONDATEANDTIME,&#39 ; 2'作为ACKCODE,'测试'作为来自table1的ACKDESCRIPTION) ON(t.SENDER = s.SENDER和t.IDENTIFIER = s.IDENTIFIER) 当匹配时更新设置t.CREATIONDATEANDTIME =' 1213',t.RECEIVER =' hello' 什么时候不匹配然后插入(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子句并重新发出dml

场景2:当数据符合条件(t.SENDER = s.SENDER和t.IDENTIFIER = s.IDENTIFIER)时,在表格中,我可以看到5个新条目。

你能帮忙吗?

2 个答案:

答案 0 :(得分:1)

您可以像这样使用MERGE STATEMENT:

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,更新else插入。它检查值是否存在,如果存在 - 更新/删除它们(调整为代码以执行您想要的操作),如果不存在,则插入它们。

答案 1 :(得分:0)

MERGE INTO table1 t USING(选择 distinct '000004'作为SENDER,'Receiver'作为RECEIVER,'1030'作为IDENTIFIER,'2016'作为CREATIONDATEANDTIME,'2'作为ACKCODE,'测试'作为来自table1的ACKDESCRIPTION)ON(t.SENDER = s.SENDER和t.IDENTIFIER = s.IDENTIFIER)当匹配然后更新设置t.CREATIONDATEANDTIME ='1213'时,t.RECEIVER ='你好'当它们没有匹配时插入(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 )

在我的查询中添加了distinct子句,它运行正常。谢谢大家回复我的帖子并指导我。