使用子查询执行H2数据库UPDATE语句报错:子查询非单列查询
解决H2数据库多列IN子查询的UPDATE错误
你遇到的问题是H2数据库默认不支持这种多列元组IN子查询的语法写法,所以抛出了"Subquery is not a single column query"的错误。下面给你两种通用且兼容性好的替代方案:
方案1:使用EXISTS子查询(跨库通用)
这是几乎所有关系型数据库都支持的写法,核心是通过关联子查询判断当前table1的行是否在table2中有匹配的col1和col2:
UPDATE table1 SET STATUS_CD = 1 WHERE EXISTS ( SELECT 1 FROM table2 t2 WHERE t2.col1 = table1.col1 AND t2.col2 = table1.col2 )
方案2:使用JOIN方式更新
H2支持通过JOIN实现批量更新,这种写法执行效率通常也不错:
UPDATE table1 t1 SET STATUS_CD = 1 FROM table2 t2 WHERE t1.col1 = t2.col1 AND t1.col2 = t2.col2
如果上面的写法在你的H2版本中不生效,可以试试嵌套查询的JOIN写法:
UPDATE ( SELECT t1.STATUS_CD FROM table1 t1 INNER JOIN table2 t2 ON t1.col1 = t2.col1 AND t1.col2 = t2.col2 ) t SET STATUS_CD = 1
额外小提示
如果一定要用你最初的多列IN语法,可以尝试修改H2的兼容性模式(比如设置为MySQL兼容)。在连接数据库时添加参数MODE=MySQL,这样H2会兼容MySQL的多列元组IN语法,但这种方式依赖数据库配置,不如前两种写法通用。
内容的提问来源于stack exchange,提问作者Exorcismus
相关产品推荐
相关产品推荐

