我有两个表:
-
PERSON
带列person_id
和total
-
DATA
带列data_a
,data_b
,data_c
,和data_person_id
每个“人”在 DATA
中可以有零个或多个条目- 您的标准一对多关系。 PERSON
有一个total
即 DATA
中的值之和的列。目前 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
,则可以使用=
。
关于java - 更新子查询中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12830288/