我正在努力处理我在 PostgreSQL 中的声明。我有 3 个表:
tbl - flags (labeled as a)
a.email
tbl - accounts (labeled as b)
b.id
b.email
tbl - foo (labeled as c)
c.account_id
c.total
我的 sql 语句如下所示:
select a.email, sum(c.total)
from flags a, accounts b, foo c
where a.email = b.email and b.id = c.account_id
此声明有效,但可能有些帐户没有帐户或总金额。嗯,这个说法没有意义,因为里面有好几个a.emails
,flags a
没有任何c.total
记录。还有几个b.emails
在accounts b
,他们在 没有任何记录c.total
。
我想要的输出:email - sum(i.total)
[email protected] 5666
[email protected] 882
[email protected] 23122
[email protected] 0 -- [email protected] doesn’t have account or any total
那么是否可以检查帐户中是否存在与标志相比的记录?如果是,让我们提示 total amount 如果不是,让我们提示0
。
首先,您的查询无效。
GROUP BY a.email
我假设您在发布问题时省略了。您还别名foo
为 asc
但随后您引用了.i
.total
现在对于丢失的结果,这是因为您正在使用(隐式)内部联接。它们是隐式的,不会影响结果。但是当使用显式连接时,很容易将它们从连接更改
INNER
为LEFT
连接。因此,通过这样做,
a LEFT JOIN b
我们保留a
了在中没有匹配行的结果b
,通过这样做,b LEFT JOIN c
我们保留b
了在中没有匹配行的结果c
。查询最终看起来像这样(添加
COALESCE()
以便我们得到零而不是没有帐户或总数的电子邮件的空值):使用子查询计算总数:
使用 COALESCE 处理 NULL 值。