在mysql和h2中使用相同的语法加入删除

Yve*_*las 6 mysql rdbms h2

我在mysql中有一个生产数据库,并在H2中进行一些Junit测试.
我正在努力寻找一种既可以在测试和生产中使用的语法,也可以删除2个表中的记录.
SQL查询使用发送到数据库

jdbctemplate.update(sqlQuery, queryArgs);
Run Code Online (Sandbox Code Playgroud)

到目前为止,我发现查询可以在mysql上运行但不在H2上,反之亦然.

我有2个表:请求和响应,在共同的datetime和milisec中有2列.这对夫妇(datetime,milisec)是请求的主键,同一对夫妇可以有几个回复.

我想删除与某些请求匹配的响应.

这个请求适用于我的sql但不适用于H2:

DELETE r.*
FROM responses AS r NATURAL JOIN Call_requests AS s
WHERE -- criteria on call_requests table
Run Code Online (Sandbox Code Playgroud)

我最接近的将是

DELETE FROM responses
where (datetime, milisec) in 
(select datetime, milisec from requests where -- criteria)
Run Code Online (Sandbox Code Playgroud)

这个上层版本适用于mysql而不是h2,其中以下带有括号的元组是反向的(适用于h2,而不是mysql)

DELETE FROM responses
where (datetime, milisec) in 
(select (datetime, milisec) from requests where -- criteria)
Run Code Online (Sandbox Code Playgroud)

ASP*_*iRE 0

您可能需要使用稍微不同的方法,因为 H2 和 MySQL 处理元组比较的方式略有不同。

您可以对 和 进行单独的比较,不是尝试使用元组比较(即,比较(datetime, milisec)requestsresponse (datetime, milisec))。datetimemilisec

要从两个表、请求响应中删除匹配的记录,对 MySQL 和 H2 数据库使用相同的 SQL 代码,这应该可行:

DELETE FROM responses
WHERE EXISTS (
    SELECT 1 
    FROM requests 
    WHERE responses.datetime = requests.datetime 
    AND responses.milisec = requests.milisec 
    -- add more criteria here if you need
)
Run Code Online (Sandbox Code Playgroud)

responses在这里,如果至少有一个条目具有requests相同的datetime和,我们将从中删除条目milisec