我正在尝试使用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个新条目。
你能帮忙吗?
答案 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子句,它运行正常。谢谢大家回复我的帖子并指导我。