选择左联接中取决于其他表中某个字段总和的行?

问题描述

我试图编写一个sql左外部联接查询,其中根据另一张(右)表中各行的字段总和选择左行。另一个表具有一个ID字段,该ID字段链接回左表,并且左表和右表之间存在一对多关系。这些表(仅简化为相关字段)如下所示:

left_table:

+--------+
| id     |
| amount |
+--------+

right_table:

+-------------------+
| id                |
| amount            |
| left_table_row_id |
+-------------------+

基本上,右表的行的数量字段具有左表中的数量的一部分,并关联回left_table,因此几行right_table可能链接到单个{{1} }行。

我试图仅选择left_table的{​​{1}}行,其中left_table 其中的金额金额 具有链接ID的行等于left_table.id=right_table_id。我们不能在WHERE子句中使用聚合,并且我对使用HAVING并不满意。我希望这是有道理的。

解决方法

您可以使用相关子查询进行过滤:

select l.*
from left_table l
where l.amount = (select sum(r.amount) from right_table r where r.id = l.id)
,

这可以通过以下查询实现:

with agg as
(
    select left_table_row_id,sum(amount) as amount
    from right_table
    group by left_table_row_id
)
select *
from left_table lt
where exists (select 1 from agg where lt.id=agg.left_table_row_id and lt.amount = agg.amount)