给定以下4个表:
CREATE TABLE events ( id, name )
CREATE TABLE profiles ( id, event_id )
CREATE TABLE donations ( amount, profile_id )
CREATE TABLE event_members( id, event_id, user_id )
我正在尝试获取所有事件的列表,以及任何成员的数量和捐款总额。问题在于捐款总额返回错误(似乎是捐款*活动成员数的笛卡尔积结果)。
以下是SQL查询语句(Postgres)
SELECT events.name, COUNT(DISTINCT event_members.id), SUM(donations.amount)
FROM events
LEFT OUTER JOIN profiles ON events.id = profiles.event_id
LEFT OUTER JOIN donations ON donations.profile_id = profiles.id
LEFT OUTER JOIN event_members ON event_members.event_id = events.id
GROUP BY events.name
捐款总额(donations.amount)返回的值等于实际捐款总额乘以活动成员行数。如果我注释掉了count(distinct event_members.id)和event_members left outer join,总和是正确的。
EXPLAIN ANALYZE
测试性能。相关子查询(就像你在解决方案中的那样)通常会慢得多。如果结果集中的行数很少,而基表中的行数很多,它仍然可能获胜。 - Erwin Brandstetter