我对SQL很陌生,而且我对我试图制作的查询感到难过。我有一个与此类似的数据集
播放器
masterID firstName lastName
11111 Rob Caspian
22222 Bob Harper
33333 Jon Willow
44444 Ron Anderson
55555 Doug Blake
外观
masterID gameName
11111 chess
11111 checkers
11111 chess
22222 chess
22222 chess
33333 monopoly
33333 monopoly
33333 monopoly
44444 chess
55555 risk
55555 chess
我想要归还所有玩家的名字和姓氏,他们只玩国际象棋而没有其他游戏。所以它应该归还鲍勃哈珀和罗恩安德森。
SELECT player.firstName, player.lastName from player, appearances where player.masterID = appearances.masterID and appearances.gameName = "chess";
我有一个查询,无论他们玩过什么其他游戏,都会让所有下过国际象棋的人回归,但我无法弄清楚如何将它限制在只下棋的玩家身上。它也应该只返回一次球员的名字。谢谢你的帮助!
答案 0 :(得分:4)
您可以在查询末尾添加另一个过滤器,以过滤掉其他游戏中显示的MasterID:
SELECT player.firstName, player.lastName
from player
join appearances on player.masterID = appearances.masterID
where appearances.gameName = 'chess'
and masterID not in(select masterID from Appearances where gameName != 'chess')
答案 1 :(得分:1)
您只需使用join和aggregation即可获得结果,如下图所示。
SELECT A.firstName, A.lastName
FROM Player A LEFT JOIN Appearances B
ON A.masterID=B.masterID
GROUP BY A.firstName, A.lastName
HAVING SUM(B.gameName = 'chess')=COUNT(*);