H2数据库中的Oracle MERGE语句

时间:2012-12-05 04:05:37

标签: sql oracle h2

我们开始在内存数据库中使用H2进行自动化测试。我们使用Oracle进行生产和销售。开发环境。因此,我们的想法是在H2测试数据库中复制表结构,就像在我们的Oracle开发数据库中一样。

Oracle SQL语句包括MERGE语句,并在查询中使用表名和USING的别名。

如何以不改变开发环境中现有查询的方式动态修改此查询以与H2兼容?

要与H2兼容的Oracle SQL示例

MERGE INTO TABLE T1
USING ( SELECT ....
        ...........
        FROM DUAL) T2

(T1& T2是表格的别名)

3 个答案:

答案 0 :(得分:9)

MERGE statement in H2语法略有不同,更简单:

MERGE INTO TEST(ID, NAME) KEY(ID)
SELECT 1, 'Hello' FROM DUAL

我想你必须写两个语句,一个用于H2,一个用于Oracle。然而SELECT部分是相同的。 The Oracle MERGE statement会更长,我相信会是:

MERGE INTO TEST T
USING (SELECT 1 ID, 'Hello' NAME FROM DUAL) D
ON (T.ID = D.ID)
WHEN MATCHED THEN 
UPDATE SET T.NAME = D.NAME
WHEN NOT MATCHED THEN 
INSERT (B.ID, B.NAME) VALUES (D.ID, D.NAME);

答案 1 :(得分:4)

标准SQL合并语法支持目前位于H2的the roadmap

  

但是,在一些简单的情况下,您可以使用 INSERT ... SELECT + WHERE NOT EXISTS 例如,仅在记录不存在时才插入

INSERT INTO T1(K1, V2, V3) 
SELECT 1, 2, 3 FROM DUAL
  WHERE NOT EXISTS (SELECT 1 FROM T1 WHERE
K1 = 1 AND V2 = 2 AND V3 = 3);

这种结构在Oracle和H2中都有效(至少在MODE = Oracle中),因此您不必为测试和prod分别使用SQL插入。

答案 2 :(得分:2)

我从2019年开始。H2支持标准的“合并到...使用...何时...”。 Documentation