1

我在 DB2 中运行的查询

select  yrb_customer.name, 
        yrb_customer.city, 
        CASE count(*) WHEN 0 THEN 0 ELSE count(*) END as #UniClubs 
from  yrb_member, yrb_customer 
where yrb_member.cid = yrb_customer.cid and yrb_member.club like '%Club%' 
group by yrb_customer.name, yrb_customer.city  order by count(*)

向我显示属于包含“俱乐部”一词的俱乐部的人员,并显示他们所属的此类俱乐部的数量 ( #UniClubs) 以及他们的姓名和城市。但是对于不属于这样一个俱乐部的学生,我仍然希望他们出现,但只有 0 而不是他们被隐藏,这就是现在正在发生的事情。我无法使用count(*). 有人可以解释一下吗?如果以上内容不够清楚,我可以进一步解释。

4

2 回答 2

2

我不熟悉 DB2,所以我在黑暗中尝试,但试试这个:

select  yrb_customer.name, 
        yrb_customer.city, 
        CASE WHEN yrb_member.club like '%Club% THEN count(*) ELSE 0 END as #UniClubs 
from  yrb_member, yrb_customer 
where yrb_member.cid = yrb_customer.cid
group by yrb_customer.name, yrb_customer.city  order by count(*)

基本上,您不想在 WHERE 子句中过滤 %Club% ,因为您希望所有行都返回。

于 2013-04-08T21:30:22.670 回答
1

你会想要一个LEFT JOIN

SELECT yrb_customer.name, yrb_customer.city,
       COUNT(yrb_member.club) as clubCount
FROM yrb_customer
LEFT JOIN yrb_member
       ON yrb_member.cid = yrb_customer.cid
          AND yrb_member.club LIKE '%Club%
GROUP BY yrb_customer.name, yrb_customer.city
ORDER BY clubCount

此外,如果元组 ( yrb_customer.name, yrb_customer.city) 是唯一的(或者应该是唯一的 - 您是否计算所有与同一个人同名的学生?),您可能会从以下方面获得更好的性能:

SELECT yrb_customer.name, yrb_customer.city,
       COALESCE(club.count, 0)
FROM yrb_customer
LEFT JOIN (SELECT cid, COUNT(*) as count
           FROM yrb_member
           WHERE club LIKE '%Club%
           GROUP BY cid) club
       ON club.cid = yrb_customer.cid
ORDER BY club.count

隐藏原始结果的原因是因为在原始查询中,您有一个隐式内部联接,这当然需要匹配行。隐式连接语法(逗号分隔FROM子句)非常适合内部(常规)连接,但对于左连接来说很糟糕,这是您真正需要的。WHERE不推荐使用隐式连接语法(以及子句中某些类型的相关过滤)。

于 2013-04-08T22:30:42.620 回答