15

我们开始使用内存数据库中的 H2 进行自动化测试。我们将 Oracle 用于我们的生产和开发环境。所以这个想法是复制 H2 测试数据库中的表结构,就像它在我们的 Oracle 开发数据库中一样。

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

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

与 H2 兼容的 Oracle SQL 示例,

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

(T1 & T2 是表的别名)

4

3 回答 3

11

H2 中的MERGE 语句有一个稍微不同的更简单的语法:

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

我想您必须编写两条语句,一条用于 H2,一条用于 Oracle。但是,该SELECT部分将是相同的。Oracle MERGE 语句会更长,我相信它会是:

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);
于 2012-12-05T05:44:57.323 回答
7

标准 SQL 合并语法支持目前在H2的路线图上。

但是,在某些简单的情况下,您可以使用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 中),因此您不必为测试和生产分别插入 SQL。

于 2014-06-11T14:37:13.663 回答
6

我来自 2019 年。H2 支持标准“合并到...使用...何时...”。 文档

于 2019-10-25T13:30:56.530 回答