我在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(*)
获得此功能。有人可以解释一下吗?如果上述内容不够明确,我可以进一步解释。
答案 0 :(得分: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%,因为您希望所有行都返回。
答案 1 :(得分: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
子句中某些类型的相关过滤)的使用被认为已弃用。