我是Postgres的新手,但不是关系数据库的新手,并且今晚写了一些奇怪的结果。有人可以帮助解释这里的计数是什么吗?
第一个查询,结果为400,000(行):
select * from mytable;
第二个查询,两个复合主键列上的组(结果很好 - 返回400,000条记录):
select PK1, PK2, count(*) cnt
from mytable
group by PK1, PK2
第三次查询错误地给了我超过140万条记录:
select PK1, PK2
from mytable
group by PK1, PK2
第二个和第三个查询之间的唯一区别是删除了count(*)字段。输出看起来不像是不同的记录 - 行是重复的。
有人知道为什么在Postgres查询中删除这个'count'字段会以这种方式扭曲输出吗?
答案 0 :(得分:1)
这对我来说并不合适。 PostgreSQL组同时进行聚合。所以别的东西必须继续下去。以下是一些要排除的事情:
仔细检查行数。通过将主查询放在cte中并从中选择count(*)来完成此操作。下面是一个例子。
检查查询计划。是否存在您未考虑的连接投影问题? explain
是你的朋友。
例如:
with query (
select PK1, PK2, count(*) cnt
from mytable
group by PK1, PK2
)
select count(*) from query;
答案 1 :(得分:1)
您可以采取以下措施来解决您的谜题:
首先确保表格中有准确的行数:
select count(*) from mytable
然后检查您有多少不同的PK1和PK2值:
select count(*) from (select distinct PK1 from mytable) a
和
select count(*) from (select distinct PK2 from mytable) a
两个值应该相等(您测试了一个唯一键),或者显着小于(没有一个是唯一键),而不是总数。
然后测试你的钥匙组合计数:
select count(*) from (select distinct PK1, PK2 from mytable) a
结果值应该相等((PK1,PK2)是唯一键),或者显着小于((PK1,PK2)不是唯一键),而不是总计数。
以下查询应该为您提供与前一个完全相同的数字:
select count(*) from (
select PK1, PK2
from mytable
group by PK1, PK2) a
以及以下
中的相同值select count(*) from (
select PK1, PK2, count(*)
from mytable
group by PK1, PK2) a
最后,以下内容应该为您提供与总计数完全相同的数字:
select sum(cnt) from (
select PK1, PK2, count(*) as cnt
from mytable
group by PK1, PK2) a
如果在任何时候,任何这些测试都没有给出预期的结果,那么您的数据就会严重损坏。