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。有时参数 :id 是 null,当这种情况发生时,我想根据 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 合并语句只有一个表和一堆值的主要内容,如果未能解决你的问题,请参考以下文章