繁体   English   中英

如何理解在 group by 和 having 子句中计算不同值的结果

[英]How to understand results of counting distinct values in group by and having clause

数据库:版本8.0.26-17 https://www.percona.com/doc/percona-server/8.0/release-notes/Percona-Server-8.0.26-17.html

我有两个产生不同结果的查询。 我不明白为什么。

1)

select eev_company_id,
count(distinct maj.dsd_prefix) as maj_cnt,
count(distinct min.dsd_prefix) as min_cnt
from ehev_most_recent as eev
inner join ekohubschema as ehs on  ehs.ehs_subcategory = eev.eev_subcategory
left join datasourcedescription as maj on maj.dsd_prefix = eev.eev_prefix and maj.dsd_type_id = 'MAJ'
left join datasourcedescription as min on min.dsd_prefix = eev.eev_prefix and min.dsd_type_id <> 'MAJ'
where ehs.ehs_category <> 'Exclusionary Factors'
group by eev.eev_company_id
having eev.eev_company_id = 'ADD53604';

结果是:

+----------------+---------+---------+
| eev_company_id | maj_cnt | min_cnt |
+----------------+---------+---------+
| ADD53604       |       2 |       1 |
+----------------+---------+---------+

第二个查询几乎相同,但group by eev_company_id having包含AND

2)

select 
count(distinct maj.dsd_prefix) as maj_cnt,
count(distinct min.dsd_prefix) as min_cnt
from ehev_most_recent as eev
inner join ekohubschema as ehs on ehs.ehs_subcategory = eev.eev_subcategory
left join datasourcedescription as maj on maj.dsd_prefix = eev.eev_prefix and maj.dsd_type_id = 'MAJ'
left join datasourcedescription as min on min.dsd_prefix = eev.eev_prefix and min.dsd_type_id <> 'MAJ'
where ehs.ehs_category <> 'Exclusionary Factors' AND eev.eev_company_id = 'ADD53604';

此查询导致:

+---------+---------+
| maj_cnt | min_cnt |
+---------+---------+
|       2 |       0 |
+---------+---------+

如您所见,这里的min_cnt是 0,而对于第一个查询,它是 1。造成差异的原因是什么?

如果我删除ekohubschema join,我会得到相同的结果:3)

select eev_company_id,
count(distinct maj.dsd_prefix) as maj_cnt,
count(distinct min.dsd_prefix) as min_cnt
from ehev_most_recent as eev
left join datasourcedescription as maj on maj.dsd_prefix = eev.eev_prefix and maj.dsd_type_id = 'MAJ'
left join datasourcedescription as min on min.dsd_prefix = eev.eev_prefix and min.dsd_type_id <> 'MAJ'
group by eev.eev_company_id
having eev.eev_company_id = 'ADD53604'; 

+----------------+---------+---------+
| eev_company_id | maj_cnt | min_cnt |
+----------------+---------+---------+
| ADD53604       |       2 |       0 |
+----------------+---------+---------+

ekohubschema表具有以下列: ehs_categoryehs_subcategoryehs_long_description ,没有任何公司 ID,但它会干扰结果。

我没有看到任何次要数据源,只有主要数据源。 这就是为什么我努力找出计数 1(对于min_cnt )的来源。

在此处输入图像描述

请查看此查询的output:

select 
   eev_company_id, 
   min.dsd_prefix
from ehev_most_recent as eev
left join datasourcedescription as min on min.dsd_prefix = eev.eev_prefix and min.dsd_type_id <> 'MAJ'
where eev.eev_company_id = 'ADD53604'; 

我认为它(输出)至少包含 1 次1 ,否则就是错误。

我做到了,我认为这是一个错误,请参阅: DBFIDDLE 我在这里报告: bug 106539

该bug也存在于MariaDB 10.6,参见: DBFIDDLE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM