Sql 插入甲骨文

Sql 插入甲骨文,sql,oracle,Sql,Oracle,我有一个表table,其中包含id、name、position、capture\u date、modified\u date、comments等列。 我正试图做一个简单的upsert,这让我发疯。 当表为空时,它必须插入,但当它不为空时,它必须更新具有相同位置的注释列行,如果它不同,它必须插入新行,而不是更新现有行。 当表为空时,我使用这个merge语句创建第一行 这个很好用。 但是,第二排必须是 1,约翰,2015年7月1日,2015年7月23日,“世界” 在这种情况下,数据几乎相同,只是位置

我有一个表
table
,其中包含
id、name、position、capture\u date、modified\u date、comments等列。
我正试图做一个简单的
upsert
,这让我发疯。 当表为空时,它必须插入,但当它不为空时,它必须更新具有相同位置的注释列行,如果它不同,它必须插入新行,而不是更新现有行。 当表为空时,我使用这个merge语句创建第一行

这个很好用。 但是,第二排必须是

1,约翰,2015年7月1日,2015年7月23日,“世界”

在这种情况下,数据几乎相同,只是位置值为2,因此必须插入新行,而不是将现有行的位置更新为2。 这就是我的merge语句所做的。有什么办法可以解决这个问题吗

    merge into customers a
using(select 1 as customer_id, 'john' as customer_name, '1' as position, '01-JUL-15' as capture_date, 
      sysdate as  modified_date, 'hello' as comments from dual) b
  on(a.customer_id=b.customer_id)
when matched then
update set a.customer_id = b.customer_id, a.customer_name = b.customer_name, 
a.position = b.position, a.capture_date= b.capture_date, a.modified_date = b.modified_date,
a.comments=b.comments
when not matched then
insert(a.customer_id, a.customer_name, a.position, a.capture_date, a.modified_date, a.comments)
values(b.customer_id, b.customer_name, b.position, b.capture_date, b.modified_date, b.comments)
我已经创建了

以便总结经验教训:

  • 1发布原始查询,而不是某个错误的代理
  • 2发布您收到的任何错误消息
您收到的错误消息是:

ORA-38104: Columns referenced in the ON Clause cannot be updated: "A"."CUSTOMER_ID" 
解决方案:从update子句中删除a.customer\u id

merge into customers a
using (select 1 as customer_id
             ,'john' as customer_name
             ,'1' as position
             ,'01-JUL-15' as capture_date
             ,sysdate as modified_date
             ,'hello' as comments
         from dual) b
on (a.customer_id = b.customer_id)
when matched then
   update
      set a.customer_name = b.customer_name
         ,a.position      = b.position
         ,a.capture_date  = b.capture_date
         ,a.modified_date = b.modified_date
         ,a.comments      = b.comments
when not matched then
   insert
      (a.customer_id
      ,a.customer_name
      ,a.position
      ,a.capture_date
      ,a.modified_date
      ,a.comments)
   values
      (b.customer_id
      ,b.customer_name
      ,b.position
      ,b.capture_date
      ,b.modified_date
      ,b.comments)
因此,经验教训:

  • 1发布原始查询,而不是某个错误的代理
  • 2发布您收到的任何错误消息
您收到的错误消息是:

ORA-38104: Columns referenced in the ON Clause cannot be updated: "A"."CUSTOMER_ID" 
解决方案:从update子句中删除a.customer\u id

merge into customers a
using (select 1 as customer_id
             ,'john' as customer_name
             ,'1' as position
             ,'01-JUL-15' as capture_date
             ,sysdate as modified_date
             ,'hello' as comments
         from dual) b
on (a.customer_id = b.customer_id)
when matched then
   update
      set a.customer_name = b.customer_name
         ,a.position      = b.position
         ,a.capture_date  = b.capture_date
         ,a.modified_date = b.modified_date
         ,a.comments      = b.comments
when not matched then
   insert
      (a.customer_id
      ,a.customer_name
      ,a.position
      ,a.capture_date
      ,a.modified_date
      ,a.comments)
   values
      (b.customer_id
      ,b.customer_name
      ,b.position
      ,b.capture_date
      ,b.modified_date
      ,b.comments)
因此,经验教训:

  • 1发布原始查询,而不是某个错误的代理
  • 2发布您收到的任何错误消息
您收到的错误消息是:

ORA-38104: Columns referenced in the ON Clause cannot be updated: "A"."CUSTOMER_ID" 
解决方案:从update子句中删除a.customer\u id

merge into customers a
using (select 1 as customer_id
             ,'john' as customer_name
             ,'1' as position
             ,'01-JUL-15' as capture_date
             ,sysdate as modified_date
             ,'hello' as comments
         from dual) b
on (a.customer_id = b.customer_id)
when matched then
   update
      set a.customer_name = b.customer_name
         ,a.position      = b.position
         ,a.capture_date  = b.capture_date
         ,a.modified_date = b.modified_date
         ,a.comments      = b.comments
when not matched then
   insert
      (a.customer_id
      ,a.customer_name
      ,a.position
      ,a.capture_date
      ,a.modified_date
      ,a.comments)
   values
      (b.customer_id
      ,b.customer_name
      ,b.position
      ,b.capture_date
      ,b.modified_date
      ,b.comments)
因此,经验教训:

  • 1发布原始查询,而不是某个错误的代理
  • 2发布您收到的任何错误消息
您收到的错误消息是:

ORA-38104: Columns referenced in the ON Clause cannot be updated: "A"."CUSTOMER_ID" 
解决方案:从update子句中删除a.customer\u id

merge into customers a
using (select 1 as customer_id
             ,'john' as customer_name
             ,'1' as position
             ,'01-JUL-15' as capture_date
             ,sysdate as modified_date
             ,'hello' as comments
         from dual) b
on (a.customer_id = b.customer_id)
when matched then
   update
      set a.customer_name = b.customer_name
         ,a.position      = b.position
         ,a.capture_date  = b.capture_date
         ,a.modified_date = b.modified_date
         ,a.comments      = b.comments
when not matched then
   insert
      (a.customer_id
      ,a.customer_name
      ,a.position
      ,a.capture_date
      ,a.modified_date
      ,a.comments)
   values
      (b.customer_id
      ,b.customer_name
      ,b.position
      ,b.capture_date
      ,b.modified_date
      ,b.comments)



您发布的声明似乎不正确。
using
子句中的查询不是从表中选择的——我假设您缺少dual
中的
。并且
上的
子句丢失。这就是告诉您是执行插入还是更新的原因。我猜这一条款在你的实际陈述中是不正确的,但因为它没有包括在内,所以很难知道。我假设匹配时您的
不应更新
id
列。@我更新了代码,复制代码时漏掉了。请发布语法正确的语句。表不是有效的表名,john应该是“john”,vales必须是值。请看一看有关合并的Oracle文档:@Rene我做了一个示例语句,我知道它不正确。我阅读了文档,但无法使其工作。@我创建的您发布的声明似乎不正确。
using
子句中的查询不是从表中选择的——我假设您缺少dual
中的
。并且
上的
子句丢失。这就是告诉您是执行插入还是更新的原因。我猜这一条款在你的实际陈述中是不正确的,但因为它没有包括在内,所以很难知道。我假设匹配时您的
不应更新
id
列。@我更新了代码,复制代码时漏掉了。请发布语法正确的语句。表不是有效的表名,john应该是“john”,vales必须是值。请看一看有关合并的Oracle文档:@Rene我做了一个示例语句,我知道它不正确。我阅读了文档,但无法使其工作。@我创建的您发布的声明似乎不正确。
using
子句中的查询不是从表中选择的——我假设您缺少dual
中的
。并且
上的
子句丢失。这就是告诉您是执行插入还是更新的原因。我猜这一条款在你的实际陈述中是不正确的,但因为它没有包括在内,所以很难知道。我假设匹配时您的
不应更新
id
列。@我更新了代码,复制代码时漏掉了。请发布语法正确的语句。表不是有效的表名,john应该是“john”,vales必须是值。请看一看有关合并的Oracle文档:@Rene我做了一个示例语句,我知道它不正确。我阅读了文档,但无法使其工作。@我创建的您发布的声明似乎不正确。
using
子句中的查询不是从表中选择的——我假设您缺少dual
中的
。并且
上的
子句丢失。这就是告诉您是执行插入还是更新的原因。我猜这一条款在你的实际陈述中是不正确的,但因为它没有包括在内,所以很难知道。我假设匹配时您的
不应更新
id
列。@我更新了代码,复制代码时漏掉了。请发布语法正确的语句。表不是有效的表名,john应该是“john”,vales必须是值。请看一看有关合并的Oracle文档:@Rene我做了一个示例语句,我知道它不正确。我阅读了文档,但无法使其工作。@我创建的sql语句无效。它在我的Oracle数据库上运行正常。不知道为什么SQLFiddle会报告该错误。我无法插入新行,如果位置更新为2,则位置为1的行将更新。如何解决这个问题。4个小时以来我一直在绞尽脑汁,除非你向我们展示你到底在做什么,否则我们无法帮助你。我尝试用sqlfiddle重做,但由于某种原因它不起作用。这正是我在本地创建的表。第一次,记录插入良好,但第二条记录未插入