Найти игроков, которые играли только в крикет? - PullRequest
0 голосов
/ 21 января 2020

У меня есть настольная игра с записями вроде:

name  games
---------------
jack  cricket
jack  football
ryan  basketball
ryan  basketball
adi   cricket

Мне нужно имя игрока, который играл только в крикет.

желаемый результат:

adi cricket

мой запрос:

SELECT count(name)
    ,games
FROM game
WHERE games = 'cricket'
GROUP BY games
HAVING count(name) = 1

Есть ли другой способ?

Ответы [ 4 ]

1 голос
/ 21 января 2020

Вы можете сделать агрегацию:

select name, min(games)
from game 
group by name
having min(games) = max(games) and min(games) = 'cricket';

Вы также можете использовать not exists:

select g.*
from games g
where not exists (select 1 from games g1 where g1.name = g.name and g1.games <> 'cricket'); 
0 голосов
/ 21 января 2020

Вы можете использовать счетчик для этого, чтобы создать довольно простой запрос. Полный пример включен.

declare @games table
(
    name varchar(10)
    , games varchar(10)
)
insert @games values
('jack', 'cricket')
, ('jack', 'football')
, ('ryan', 'basketball')
, ('ryan', 'basketball')
, ('adi', 'cricket')


select name
    , count(*)
from @games
GROUP BY name
HAVING count(distinct games) = 1
    and MAX(games) = 'cricket'
0 голосов
/ 21 января 2020

Вы можете попробовать следующий запрос.

SELECT *
FROM Testing
INNER JOIN (
    SELECT name
        ,Count(games) AS Cnt
    FROM Testing
    GROUP BY name
    ) TEMP ON Testing.name = TEMP.name
    AND Cnt = 1
    AND Testing.games = 'cricket'

Здесь вы можете найти live демо .

0 голосов
/ 21 января 2020

Я бы попробовал следующее:

SELECT DISTINCT
       gms1.name,
       gms1.games
FROM   game gms1
WHERE  gms1.games = 'cricket'
  AND  NOT EXISTS (SELECT *
                   FROM   game gms2
                   WHERE  gms1.name = gms2.name
                     AND  gms1.games <> gms2.games);

Словами: выберите всех игроков, которые занимались крикетом и больше ничего не делали.

...