问题描述
我试图编写一个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)