PostgreSQL空表关联查询COUNT结果异常问题及解决方法
问题解决与原因解释
正确查询写法
你可以通过独立统计两个表的方式得到预期结果,推荐两种写法:
方法1:子查询独立统计
SELECT (SELECT COUNT(DISTINCT uuid) FROM table_a) AS entry_count_a, (SELECT COUNT(DISTINCT uuid) FROM table_b) AS entry_count_b;
每个子查询单独计算对应表的UUID数量,互不影响,即使其中一个表为空也能得到正确结果。
方法2:基于虚拟表的左连接
SELECT COUNT(DISTINCT ta.uuid) AS entry_count_a, COUNT(DISTINCT tb.uuid) AS entry_count_b FROM (SELECT 1) AS dummy LEFT JOIN table_a ta ON true LEFT JOIN table_b tb ON true;
通过一个包含单行数据的虚拟表dummy作为基础,左连接两个目标表:
table_a有数据,左连接后保留所有行,COUNT(DISTINCT ta.uuid)得到正确值table_b为空,左连接后tb.uuid全为NULL,COUNT(DISTINCT NULL)返回0
原查询返回0的原因
你用逗号连接两个表等价于CROSS JOIN(笛卡尔积),而笛卡尔积的规则是:只要其中一个表为空,最终结果集就是空集。
当结果集为空时,COUNT(DISTINCT ...)作用在空数据集上,无论统计的是什么列,结果都是0——这就是为什么两个计数都返回0的原因。而单独查询table_a时,结果集有数据,COUNT能正常统计出非零值。
内容的提问来源于stack exchange,提问作者DaHoC
相关产品推荐
相关产品推荐

