java - 更新子查询中的数据

标签 java sql hibernate postgresql

我有两个表:

  • PERSON带列person_idtotal
  • DATA带列data_a , data_b , data_c ,和data_person_id

每个“人”在 DATA 中可以有零个或多个条目- 您的标准一对多关系。 PERSON有一个totalDATA 中的值之和的列。目前 total 之间存在一些差异。以及 DATA 中的实际条目哪里DATA是正确的,但是 total是错误的。

这是我用来查找差异的查询:

SELECT
  person_id
FROM PERSON JOIN (
  SELECT
    data_person_id,
    SUM( data_a + data_b + data_c ) as data_total
  FROM
    DATA
  GROUP BY
    data_person_id
  ) x ON data_person_id = person_id
WHERE
  person_total != data_total

我计划通过 Hibernate 作为查询来执行此操作,其中后端将是 Postgres 9.x。

我试图理解/修复的错误查询是:

UPDATE
  ONLY PERSON
SET
  total = data_info.calc_total
FROM (
  SELECT
    SUM( data_a + data_b + data_c ) as calc_total
  FROM
    DATA
  WHERE
    DATA.data_person_id = person_id
  GROUP BY
    DATA.data_person_id
) as data_info
WHERE
  PERSON.person_id IN (
    SELECT
      data_person_id
    FROM PERSON JOIN (
      SELECT
        data_person_id,
        SUM( data_a + data_b + data_c ) as data_total
      FROM
        DATA
      GROUP BY
        data_person_id
      ) x ON person_id = data_person_id
    WHERE
      total != data_total
  )

现在,它不会运行,因为 WHERE DATA.data_person_id = person_id 。但如果我把它去掉,就会使用错误的值。

以下似乎有效,但我很困惑为什么:

UPDATE
  ONLY PERSON
SET
  total = data_info.calc_total
FROM 
  PERSON P JOIN (
    SELECT
      data_person_id,
      SUM( data_a + data_b + data_c ) as calc_total
    FROM
      DATA
    WHERE
      DATA.data_person_id = person_id
    GROUP BY
      DATA.data_person_id
  ) as data_info ON P.person_id = data_person_id
WHERE
  PERSON.person_id IN (
    SELECT
      data_person_id
    FROM PERSON JOIN (
      SELECT
        data_person_id,
        SUM( data_a + data_b + data_c ) as data_total
      FROM
        DATA
      GROUP BY
        data_person_id
      ) x ON person_id = data_person_id
    WHERE
      total != data_total
  )

我相信我的问题在于我对 doc 的误解(我猜是关于自连接的部分)。

此外,任何改进此查询的方法都值得赞赏!

最佳答案

看来您的查询太复杂了。任务应该很简单:

UPDATE person p
SET    total = d.calc_total
FROM (
  SELECT data_person_id, sum(data_a + data_b + data_c) as calc_total
  FROM   data
  GROUP  BY 1
) d
WHERE  p.person_id = d.data_person_id
AND    p.total IS DISTINCT FROM d.calc_total;
  • 首先从 data 表中聚合 calc_total,按 data_person_id 分组。

  • 然后在 UPDATE 的 FROM 子句中使用此子查询。

  • 我使用 IS DISTINCT FROM 来确保覆盖 NULL 值,而实际上只更新会更改的行。
    如果所有涉及的列都定义为NOT NULL,则可以使用=

-> sqlfiddle demo.

关于java - 更新子查询中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12830288/

相关文章:

sql - 这可以在 Oracle SQL 中计算 p 值吗?

php - MySQL:每个 INNER JOIN 的不同条件

java - Hibernate 中的 @onetomany 注释不正确

java - Spring + hibernate : I can't delete a record from a table

java - Log4j DailyRollingFileAppender 与 ConsoleAppender 性能对比

java - jsp页面无法获取整数值

Java 和 Python 归并排序

java - 如何在eclipse中设置sqoop2应用程序项目?

使用字符串值变量的双向频率表的 SQL

linux 中的 java ${user.home} 变量