Oracle SQL 合并语句只有一个表和一堆值

Posted

技术标签:

【中文标题】Oracle SQL 合并语句只有一个表和一堆值【英文标题】:Oracle SQL merge statement with only 1 table and a bunch of values 【发布时间】:2012-04-13 13:42:39 【问题描述】:

我正在使用 Spring JDBC 和 oracle SQL。

使用 SpringJDBC 类 MapSqlParameterSource,我已经映射了我想要合并的数据。

现在我想使用合并语句来更新/插入数据库表。我只有一张表和一堆我想合并到其中的参数。

 merge into proj.person_registry pr
using ( ! parameters should go here somehow? )
on (pr.id = :id or pr.code = :code)
when matched then 
update set pr.code             = :code,
        pr.name                 = :name,
        pr.firstname            = :firstname,
        pr.cl_gender            = :cl_gender,
        pr.cl_status            = :cl_status,
        pr.aadress              = :aadress,
        pr.aadress_date         = :aadress_date 
when not matched then
insert values (:code, :name, :firstname, :cl_gender, :cl_status, ;aadress, :aadress_date);

我必须以某种方式为 using 关键字创建一个临时表还是有其他方法?我将如何进行这样的合并?

还有两个唯一键 pr.id 和 pr.code。有时参数 :idnull,当这种情况发生时,我想根据 pr.code 与 :code 匹配来达到更新语句。如果我的更新包含以下行,它是否仍然有效:

update set pr.code             = :code,

【问题讨论】:

关键字:“使用(!参数应该以某种方式放在这里?)”。我是否必须以某种方式创建一个临时表并将其放在 using 之后,或者是否有其他方法可以将我的值放入这个合并语句中。如果没有其他办法,我该如何制作临时表? 不,您不需要任何临时表...检查此链接以了解合并语法。docs.oracle.com/cd/B19306_01/server.102/b14200/… 我认为我需要使用子查询。如何使用纯参数值创建可接受的子查询,Spring 用正常值“123455”替换 :code。这个限制也搞砸了我:“你不能更新在 ON 条件子句中引用的列。” - 因为我想在 :id isnt null 时更新 pr.code.. 您能否发布完整的查询以及您遇到的错误... 到目前为止,这是完整的查询,我不知道如何完成它,也没有解决方法。我大概能弄清楚的约束问题。我需要分析我是否需要更新 pr.code,或者如果 :id 不为空,它是否始终与 DB 值匹配。工作日暂时结束:我稍后再回来。 【参考方案1】:

这应该可行:

merge into proj.person_registry pr
using ( 
  select 42 as id
         'xyz' as code,
         'Dent' as name,
         'Arthur' as firstname,
         'male' as cl_gender
         'closed' as cl_status,
         'Somewher' as aaddress,
         current_date as aaddress_date
   from dual
) t on (pr.id = t.id or pr.code = t.code)
when matched then 
update set pr.code             = t.code,
        pr.name                 = t.name,
        pr.firstname            = t.firstname,
        pr.cl_gender            = t.cl_gender,
        pr.cl_status            = t.cl_status,
        pr.aadress              = t.aadress,
        pr.aadress_date         = t.aadress_date 
when not matched then
insert values (t.code, t.name, t.firstname, t.cl_gender, t.cl_status, ;aadress, t.aadress_date);

我不熟悉 Spring 的 JDBC 模板,但是用参数占位符替换 select ... from dual 查询中的实际值应该可以。

【讨论】:

感谢这几乎可以工作。剩下的唯一问题是我无法更新 pr.code,因为我在 ON 子句中引用了它:on (pr.id = t.id or pr.code = t.code)。如果我用pr.code = t.code 输入更新,这不是问题,但如果我用pr.id = t.id 输入它 pr.code 需要更新.. 为什么这个约束仍然在合并子句上......?

以上是关于Oracle SQL 合并语句只有一个表和一堆值的主要内容,如果未能解决你的问题,请参考以下文章

合并多个sql更新语句(Oracle)

我可以在一个语句中运行多个 SQL 部分吗?

oracle中建父表和子表的语句是啥?

1.Oracle数据库查看用户锁表和对表解锁的sql语句

结合事实表和维度表的SQL语句?

一次合并到多个语句 Oracle SQL