我在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)
您可能需要使用稍微不同的方法,因为 H2 和 MySQL 处理元组比较的方式略有不同。
您可以对 和 进行单独的比较,而不是尝试使用元组比较(即,比较(datetime, milisec)requests和response (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。