首页 > 解决方案 > 如何将 postgres 脚本传输到 hsqldb 脚本?

问题描述

我有一个脚本,我在 postgres db 中成功运行,但是当我在 hsqldb 中运行时它失败了。有人可以帮我更改此 sql 以使其适用于 HSQLDB 和 Postgres DB 吗?下面是我的脚本:

UPDATE tableA af
SET columnA2 = b.columnB2
from
  ( select columnB1, columnB2 from.....) as b
Where af.columnA1 = b.columnB1;

当我在 hsqldb 中运行它时,这会引发以下异常:

引起:java.sql.SQLSyntaxErrorException:用户缺少特权或找不到对象:b.columnB2 引起:org.hsqldb.HsqlException:用户缺少特权或找不到对象:b.columnB2

谢谢。


更新:我创建了另一个视图以使我的问题更清楚。

table_A 有 2 列:company_code、company_number 和 view_B 有 2 列:company_code、company_number_correct_answer

table_A 有 10000 行,而 view_B 只有 2 行。 我想要的是更新 table_A 中的 2 条记录,company_code 存在于 view_B 中并设置 table_A.company_number = view_B.company_number_correct_answer

标签: javasqlpostgresqlhsqldbliquibase

解决方案


在标准 SQL 中,FROM 子句(或 JOIN 或类似的东西)对 UPDATE 语句无效。

如果您想要一个适用于多个数据库产品的 UPDATE 语句,您将不得不使用一个共同相关的子查询:

update table_a
  set columna2 = (select columnb2
                  from table_b 
                  where table_b.columnb1 = table_a.columna1)
where exists (select * 
              from table_b 
              where table_b.columnb1 = table_a.columna1);

请注意,这要求它table_b.columnb1是唯一键或主键,否则子查询将返回多行,这将导致错误)。


推荐阅读