Sql H2数据库中的Oracle合并语句

Sql H2数据库中的Oracle合并语句,sql,h2,sql-merge,Sql,H2,Sql Merge,我们开始使用H2内存数据库进行自动化测试。我们在生产和开发环境中使用Oracle。因此,我们的想法是在H2测试数据库中复制表结构,就像在我们的Oracle dev数据库中一样 Oracle SQL语句包括MERGE语句、表名使用别名以及查询中的use 如何动态修改此查询,使其与H2兼容,而不改变开发环境中的现有查询 Oracle SQL示例,将与H2兼容 MERGE INTO TABLE T1 USING ( SELECT .... ........... FRO

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

Oracle SQL语句包括MERGE语句、表名使用别名以及查询中的use

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

Oracle SQL示例,将与H2兼容

MERGE INTO TABLE T1
USING ( SELECT ....
        ...........
        FROM DUAL) T2
(T1和T2是表的别名)

的语法稍有不同,更简单:

MERGE INTO TEST(ID, NAME) KEY(ID)
SELECT 1, 'Hello' FROM DUAL
我想你必须写两个语句,一个用于H2,一个用于Oracle。然而,
SELECT
部分是相同的。会更长,我相信会是:

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);

标准SQL合并语法支持目前在H2上

  • 支持标准合并语句:
但是,在一些简单的情况下,您可以使用INSERT。。。选择不存在的+位置 例如,仅在记录不存在时插入

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插入。

我从2019年开始。H2支持标准的“在…时使用…合并到…中”。

您的项目为自动化测试选择了不同风格的数据库,一个具有不同SQL drammar的数据库?弗诺德。如果你必须重写你的应用程序,使你的自动化测试运行你的测试证明了什么?我们选择H2,因为它可以运行一个内存中的数据库,速度非常快。是的,但如果它不能运行你在开发和生产中使用的SQL语法,那么测试运行得有多快并不重要,它们无关紧要。我看不出为什么这个问题会被否决——H2的特点是模仿Oracle语句语法('MODE=Oracle'),在业界,对内存数据库运行快速集成测试是一种常见且良好的做法。感谢您的快速响应。那么,根据上面的语法,这是否意味着我不能在H2中为查询使用别名?是的,但它不是别名。语句的整个语法是不同的。