INSERT INTO table1(id,dept_id,name,description,creation_time,modified_time)
VALUES('id','dept_id','name','description','creation_time','modified_time')
ON DUPLICATE KEY UPDATE dept_id=VALUES(dept_id),name=VALUES(name),
description=VALUES(description),creation_time=VALUES(creation_time),
modified_time=VALUES(modified_time)
我用下面的oracle来转换上面的mysql查询。查询失败。您能帮我找出oracle查询出什么问题吗?
Merge into table1 t1 using
(VALUES ('id','dept_id','name','description','creation_time','modified_time')) as temp
(id,dept_id,name,description,creation_time,modified_time) on t1. id = temp.id
WHEN MATCHED THEN UPDATE SET dept_id=t1.dept_id, description=t1.description, name=t1.name,
creation_time=t1.creation_time, modified_time=t1.modified_time
WHEN NOT MATCHED THEN INSERT (id,dept_id,name,description,creation_time,modified_time)
VALUES ('id','dept_id','name','description','creation_time','modified_time')
答案 0 :(得分:0)
为此,您需要在using
子句中使用表或子查询(在您的情况下,您需要一个子查询)。
在Oracle中,如果需要选择某些内容而无需从实际表中进行选择,则可以使用对偶表。这是只包含单行和单列的表。
因此,您的merge语句应类似于:
MERGE INTO table1 tgt
USING (SELECT 'id' id,
'dept_id' dept_id,
'name' NAME,
'description' description,
'creation_time' creation_time,
'modified_time' modified_time
FROM dual) src
ON tgt.id = src.id
WHEN MATCHED THEN
UPDATE
SET tgt.dept_id = src.dept_id,
tgt.description = src.description,
tgt.name = src.name,
tgt.creation_time = src.creation_time,
tgt.modified_time = src.modified_time
WHEN NOT MATCHED THEN
INSERT
(tgt.id,
tgt.dept_id,
tgt.name,
tgt.description,
tgt.creation_time,
tgt.modified_time)
VALUES
(src.id,
src.dept_id,
src.name,
src.description,
src.creation_time,
src.modified_time);
请注意when not matched
子句如何使用源子查询中的列,而不是使用您提供的文字值。 (我假设在您的实际代码中,这些文字值实际上是变量; creation_time
是一个非常奇怪的值,要存储在标有creation_time的列中!)
我还切换了别名,以使您在与之合并的地方更清楚;我发现这使您更容易理解merge语句在做什么。 YMMV。