繁体   English   中英

SQL两个计数与三个表

[英]SQL two counts with three tables

我需要一个从三个表(公司,权限A,权限B)中读取的SQL查询。 权限A和B是am:n关系表。 我想计算与公司相关的权利A和B中的条目。

公司结构:

CID | Name | ...

权利结构A

RIDe | CID | ...

权利结构B

RIDu | CID | ...

这是我当前的SQL语句。 我有时获得正确的值,但有时却没有。 我不知道为什么

SELECT 
    company.*, 
    count(rightsa.RIDe) AS AnzahlE, 
    count(rightsb.RIDu) AS AnzahlU 
FROM company 
LEFT JOIN rightsa ON company.CID = rightsa.CID 
LEFT JOIN rightsb ON company.CID = rightsb.CID 
GROUP BY company.CID ORDER BY company.name;

在您的计数功能中使用DISTINCT ,因此它将仅rightsb.RIDu每个公司的不同rightsa.RIDerightsb.RIDu

SELECT company.*, 
count(DISTINCT rightsa.RIDe) AS AnzahlE, 
count(DISTINCT rightsb.RIDu) AS AnzahlU 
FROM company 
LEFT JOIN rightsa ON company.CID = rightsa.CID 
LEFT JOIN rightsb ON company.CID = rightsb.CID 
GROUP BY company.CID ORDER BY company.name;

count()与其他聚合函数的不同之处在于包括null值:大多数聚合函数从考虑中排除了 null

对于具有group by子句的select语句,根据SQL标准,结果集中的每一列必须为

  • 分组列或表达式,
  • 聚合函数
  • 一个字面意思
  • 涉及上述一项或多项的表达

根据SQL标准,其他任何情况最多都是未定义的行为:您依赖于特定SQL实现的变数。

尝试这样的事情:

select c.* ,
       coalesce( a.cnt , 0 ) as AnzahlE ,
       coalesce( b.cnt , 0 ) as AnzahlU
from company c
left join ( select CID, count(*) as cnt from rightsa group by CID ) a
left join ( select CID, count(*) as cnt from rightsb group by CID ) b
order by c.name

您可能还会考虑使用相关的子选择 ,以更好地表达您的意图:

select c.*
       (select count(*) from rightsa a where a.CID = c.CID) as AnzahlE ,
       (select count(*) from rightsb b where b.CID = c.CID) as AnzahlU
from company c
order by c.Name

暂无
暂无

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

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