我有一张国家足球俱乐部的桌子。字段是“teamName”,“playerName”和“country”。
我想算一下所有球员都是外国人的球杆
。我尝试了以下查询,但我认为它不起作用,因为看起来我们至少有一个外国人,但如果一个团队的所有玩家都是外国人,我想要计算它!
SELECT COUNT(DISTINCT teamName)
FROM teams
WHERE country not like '%England%'
请指教。谢谢!
答案 0 :(得分:4)
一种方法是:
SELECT COUNT(DISTINCT teamName)
FROM teams T1
WHERE NOT EXISTS
( select * from teams T2
WHERE T1.teamName=T2.teamName and T2.country like '%England%')
答案 1 :(得分:0)
甚至连接似乎都需要一个内部查询:
SELECT COUNT(*)
FROM (
SELECT teamName,
SUM(country like '%England%') AS Locals
FROM teams
GROUP BY teamName
) AS t
WHERE Locals = 0;
似乎应该有一个较短的答案......
答案 2 :(得分:0)
快速而肮脏的回答,它只传递一个数据,没有子查询。这选择了所有外国球队。如果那不是你想要的,你可以使用CASE
表达式。
SELECT team_name
FROM teams
GROUP BY team_name
HAVING COUNT(country)=
SUM(CASE country != 'England' WHEN TRUE THEN 1 ELSE 0 END);
更长的回答:您的架构未正常化,但应该是。您想要teams
的表和players
的第二表,其中包含该球员当前球队的球队表中的外键。这是基本的DB规范化。但是,使用这两个表的连接替换FROM
中的单个表,相同的GROUP BY
/ HAVING
技巧可以正常工作。