【问题标题】:Insert first and then update the table using SQL statement先插入,然后使用 SQL 语句更新表
【发布时间】:2016-02-10 14:09:33
【问题描述】:

我正在尝试使用插入和更新 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 回复后更新

合并到表 1 t USING(select '000004' as SENDER,'Receiver' as RECEIVER ,'1030' as IDENTIFIER,'2016' as CREATIONDATEANDTIME,'2' as ACKCODE,'Test' as ACKDESCRIPTION from table1 ) 开(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) 值(s.SENDER,s.RECEIVER,s.IDENTIFIER,s.CREATIONDATEANDTIME,s.ACKCODE,s.ACKDESCRIPTION)

查询的输出: 场景一:当没有符合条件的数据时(t.SENDER = s.SENDER and t.IDENTIFIER = s.IDENTIFIER),报错如下 ORA-30926: 无法在源表中获得稳定的行集。
原因:由于大型 dml 活动或非确定性活动 where 子句,无法获得一组稳定的行。
行动:删除任何非确定性 where 子句并重新发出 dml

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

你能帮忙吗?

【问题讨论】:

  • 看起来像 Oracle 错误消息而不是 mysql?!
  • oracle可能拥有mysql,但这并不意味着oracle RDBMS会突然开始支持mysql-specific sql extensions...
  • 这被标记为 Mysql 但你有一个 Oracle 错误。您实际使用的是什么数据库?
  • 抱歉...我正在使用 ORACLE...:(
  • 也许您需要使用MERGE 语句而不是重复键。

标签: sql oracle


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

【讨论】:

  • MERGE INTO t1 t USING(select '1' as c1,'2' as c2 ,'a' as c3,'b' as c4,'c' as c5) s ON(t. c1= s.c1 和 t.c2 = s.c2) 匹配时更新设置 t.c3 = '1213' 和 t.c4 = 'test' 不匹配时插入 (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 我的错,编辑了答案。在 USING() 部分中从 DUAL 中丢失。 :) 现在可以工作了。
  • 我不能使用同一张 t1 表吗?根据要求..我不应该使用双表
  • 我尝试使用 t1 table 而不是 dual,但它的抱怨 SQL 命令没有正确结束。
  • 不要使用t1表,可以使用dual,它是oracle内部构造的表。在这种情况下你需要它,无论如何,这就是答案
【解决方案2】:

MERGE INTO table1 t USING(select distinct '000004' 作为 SENDER,'Receiver' 作为 RECEIVER,'1030' 作为 IDENTIFIER,'2016' 作为 CREATIONDATEANDTIME,'2' 作为 ACKCODE,'Test ' as ACKDESCRIPTION from table1 ) s ON(t.SENDER = s.SENDER and t.IDENTIFIER = s.IDENTIFIER) WHEN MATCHED THEN UPDATE SET t.CREATIONDATEANDTIME = '1213',t.RECEIVER = 'hello' WHEN NOT MATCHED THEN INSERT (t.SENDER,t.RECEIVER,t.IDENTIFIER,t.CREATIONDATEANDTIME,t.ACKCODE,t.ACKDESCRIPTION) 值 (s.SENDER,s.RECEIVER,s.IDENTIFIER,s.CREATIONDATEANDTIME,s.ACKCODE,s.ACKDESCRIPTION )

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多