【问题标题】:How to transfer postgres script to hsqldb script?如何将 postgres 脚本传输到 hsqldb 脚本?
【发布时间】:2019-09-13 07:55:30
【问题描述】:

我有一个脚本,我在 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

【问题讨论】:

  • 请发布整个查询。请注意,HSQLDB 和 Postgres 使用截然不同的语法。
  • 不相关,但是:from (select ... from b) as b 对于 Postgres 可以简化为 from b
  • @TimBiegeleisen:由于私人内部信息,我无法上传整个查询。但是问题是:HSQLDB 不理解别名。
  • 你应该使用 HQL 或 JPA,这与数据库无关。
  • @TimBiegeleisen:我的系统使用liquibase脚本更新数据到表,测试环境使用hsqldb。运行 liquibase 时,SpringBoot 应用程序构建失败。这就是为什么我说我需要为 hsqldb 和 postgres 修复那个简单的查询。

标签: java sql postgresql hsqldb liquibase


【解决方案1】:

你也可以在 HSQLDB 中使用 MERGE

MERGE INTO tableA af
USING (select columnB1, columnB2 from.....) as b
ON af.columnA1 = b.columnB1
WHEN MATCHED THEN
UPDATE SET af.columnA2 = b.columnB2

【讨论】:

    【解决方案2】:

    在标准 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 是唯一键或主键,否则子查询将返回多行而导致错误)。

    【讨论】:

    • 我无法使用您的查询,因为它会使用与 columna2 相同的值更新整个 table_a。这就是我使用别名并在外面添加 WHERE 子句的原因。它在 postgres 中工作,但在 hsqldb 中它不理解别名。
    • 更新了我的问题。请检查一下。
    • @SonPham:您需要一个 WHERE 条件,该条件仅更新存在匹配项的行。查看我的编辑
    • 如果该答案解决了您的问题,那么请accept它,以便您的问题被标记为已解决。
    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多