我们开始在内存数据库中使用H2进行自动化测试。我们使用Oracle进行生产和销售。开发环境。因此,我们的想法是在H2测试数据库中复制表结构,就像在我们的Oracle开发数据库中一样。
Oracle SQL语句包括MERGE语句,并在查询中使用表名和USING的别名。
如何以不改变开发环境中现有查询的方式动态修改此查询以与H2兼容?
要与H2兼容的Oracle SQL示例
MERGE INTO TABLE T1
USING ( SELECT ....
...........
FROM DUAL) T2
(T1& T2是表格的别名)
答案 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。
- 支持标准MERGE声明:http://en.wikipedia.org/wiki/Merge_%28SQL%29
但是,在一些简单的情况下,您可以使用 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