在mysql和h2中使用相同的语法进行Join删除

icnyk63a  于 2023-08-02  发布在  Mysql
关注(0)|答案(1)|浏览(122)

我在mysql中有一个生产数据库,并在H2中做了一些Junit测试。
我正在努力寻找一种语法,既可以在测试中工作,也可以在生产中删除2个表中的记录。
SQL查询使用以下命令发送到数据库

jdbctemplate.update(sqlQuery, queryArgs);

字符串
到目前为止,我已经找到了在mysql上工作但在H2上不工作的查询,反之亦然。
我有两张table:请求和响应,在公共datetime和milisec中有2列。couple(datetime,milisec)是请求的主键,同一对可以有多个响应。
我想删除与某些请求匹配的响应。
这个请求在我的SQL中工作得很好,但在H2中不行:

DELETE r.*
FROM responses AS r NATURAL JOIN Call_requests AS s
WHERE -- criteria on call_requests table


我最接近的说法是

DELETE FROM responses
where (datetime, milisec) in 
(select datetime, milisec from requests where -- criteria)


上面的版本适用于mysql,而不是h2,下面的tuple周围的括号是相反的(适用于h2,而不是mysql)

DELETE FROM responses
where (datetime, milisec) in 
(select (datetime, milisec) from requests where -- criteria)

xdnvmnnf

xdnvmnnf1#

您可能需要使用稍微不同的方法,因为H2和MySQL处理元组比较的方式略有不同。
与尝试使用元组比较(即比较来自requests(datetime, milisec)和来自responses(datetime, milisec)),您可以分别对datetimemilisec进行比较。
要从两个表中删除匹配的记录,requestsresponses,对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
)

字符串
如果requests中至少有一个条目具有相同的datetimemilisec,我们将从responses中删除条目。

相关问题