【问题标题】:How to rewrite the following SQL query so that it works with HSQLDB如何重写以下 SQL 查询以使其与 HSQLDB 一起使用
【发布时间】:2021-08-26 16:20:00
【问题描述】:

我有一个表格“摘要”,我想在其中按 id 保留一些摘要数字 另一个表“foo”。这是使用 UPDATE FROM 的更新查询,似乎 工作

UPDATE summary
SET    sum1 = t.sizes,
       sum2 = t.counts
FROM   (SELECT id,
               sum(size)  AS sizes,
               sum(count) AS counts
        FROM   foo
        WHERE  id IN (SELECT id
                      FROM   summary)
        GROUP  BY id) t
WHERE  t.id = summary.id;  

此查询适用于 Postgresql,但在 HSQL 中失败,因为 UPDATE FROM 不是标准 SQL。

问题,如何用标准 SQL 重写这个查询?

PS:它可能是“标准 SQL”。所以要更具体一些。当我在 HSQLDB 中执行此查询时,我收到此错误:

Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: T.SIZES

这可能是我真正需要的——如何让这个查询与 HSQLDB 一起工作。

【问题讨论】:

  • 没有方便的方法来重写它。
  • ANSI 标准对于复杂的更新来说很尴尬。几乎没有人完全实现它,每个 DB 实现它都有点不同,而且他们在标准机构中的代表都不能就解决问题的方法达成一致(或者不愿意妥协他们自己现有的语法)。
  • 这是标准 SQL - sql 中没有 UPDATE FROM
  • HSQL 抛出此异常:Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: T.SIZES。可能问题不在于引用 T 的 UPDATE/FROM。
  • 该消息与语法无关。这是关于权限的。

标签: sql postgresql hsqldb


【解决方案1】:

您可以将其重写为 MERGE 语句,但不能重写为 UPDATE 语句:

MERGE INTO summary
USING (SELECT
               id,
               SUM(size)  AS sizes,
               SUM(count) AS counts
        FROM   foo GROUP BY id)  AS T(id, sizes, counts)
ON t.id = summary.id
WHEN MATCHED THEN UPDATE SET sum1 = t.sizes, sum2 = t.counts  

【讨论】:

    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 2014-12-23
    • 2018-01-06
    • 2017-06-01
    • 2021-05-01
    • 2014-03-18
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多