在 PostgreSQL 和 HQL 中使用子表提取多个结果

问题描述 投票:0回答:1

在以下场景中,

PostgreSQL
数据库中有 3 个表(为了清楚起见,简化了表和值)。我正在尝试获取以下值:

  • 2020 年 (1300) 父表中记录 (101, 102, 103) 的金额总和
  • parent-a 中对应记录的数量(4)
  • parent-b中对应记录的数量(2)

家长:

| 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
工作?

sql database postgresql join hql
1个回答
0
投票

我看到的简单解决方案是使用聚合和两个标量子查询。例如:

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
© www.soinside.com 2019 - 2024. All rights reserved.