[英]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.RIDe
和rightsb.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.