私は2つのテーブルを持っています:
PERSON
列person_id
とtotal
DATA
列data_a
、、、、およびdata_b
_data_c
data_person_id
DATA
各「人」は、標準の1対多の関係に0個以上のエントリを持つことができます。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
バックエンドがPostgres9.xになるクエリとして、Hibernateを介してこれを行う予定です。
私が理解/修正しようとしている間違ったクエリは次のとおりです。
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
)
私の問題は、ドキュメントの誤解にあると思います(自己結合に関する部分を推測しています)。
また、このクエリを改善する方法はありがたいです!