在以下场景中,
PostgreSQL
数据库中有 3 个表(为了清楚起见,简化了表和值)。我正在尝试获取以下值:
家长:
| id | name | amount | year |
----------------------------------------
| 101 | Henry | 300 | 2020 |
----------------------------------------
| 102 | Carol | 100 | 2020 |
----------------------------------------
| 103 | Tom | 900 | 2020 |
----------------------------------------
| 104 | Fredrick | 150 | 2022 |
----------------------------------------
| 105 | Mary | 180 | 2023 |
----------------------------------------
孩子-a:
| id | parent_id | value |
--------------------------------------
| 1 | 101 | value-a |
--------------------------------------
| 2 | 101 | value-b |
--------------------------------------
| 3 | 101 | value-c |
--------------------------------------
| 4 | 102 | value-d |
--------------------------------------
child-b:
| id | parent_id | value |
--------------------------------------
| 1 | 101 | value-x |
--------------------------------------
| 2 | 102 | value-y |
--------------------------------------
| 3 | 105 | value-z |
--------------------------------------
| 4 | 106 | value-t |
--------------------------------------
为此,我创建了以下查询(我将其恢复为 HQL)。因为,当我连接表时,金额值会相乘,并且当我通过子子句对左连接中的记录进行分组时,它会在 HQL 中给出错误,因为 HQL 不支持 JOIN 中的子子句:
select (
COALESCE(sum(p.amount), 0),
(
select count(ca) from child_a ca left join
parent p on ca.parent_id = p.id
where p.year = 2020
),
(
select count(cb) from child_b cb left join
parent p on cb.parent_id = p.id
where p.year = 2020
)
) from parent p where p.year = 2020
有没有更好的方法来改善这个问题,并且也可以
HQL
工作?
我看到的简单解决方案是使用聚合和两个标量子查询。例如:
select
sum(amount),
(select count(*) from child_a a where a.parent_id = p.id),
(select count(*) from child_b b where b.parent_id = p.id)
from parent p
where year = 2020