2016-11-29 2 views
0

Я довольно новый, используя SQL, и, возможно, есть лучший способ сформулировать эту проблему, но можно четко описать, используя следующий пример ...SQL выбор строки в таблице, которая соответствует n числу строк в другой таблице

в базе данных видеоигры, у меня есть таблица игроков с несколькими учетными записями:

create table Player (
    login varchar(15) not null, 
    name varchar(15) not null, 
    gender char(1)  not null, 
    ... 
    ); 

Каждая учетная запись имеет несколько аватары

create table Avatar (
    login varchar(15) not null, 
    name varchar(15) not null, 
    gender char(1) 
    ... 
    ); 

Я пытаюсь запросить плеер, где ВСЕ их аватары соответствуют их полу. Следовательно, только если игрок является мужчиной, и все их аватары также являются мужчинами, я хочу включить ряд (и наоборот с женщиной).

ответ

2
SELECT * FROM Player p WHERE NOT EXISTS(SELECT * FROM Avatar a WHERE a.login = p.login AND a.gender <> p.gender) 

Это должно сделать трюк. Хотя он также соответствует игрокам, где вообще нет аватара.

SELECT * FROM Player p WHERE NOT EXISTS (SELECT * FROM Avatar a WHERE a.login = p.login AND a.gender <> p.gender) AND COUNT(SELECT * FROM Avatar a WHERE a.login = p.login) >= 1 

... конечно, предполагается, что «логин» является уникальным идентификатором для пользователя.

+0

Первый запрос, кажется, работает (правильно сужается), но второй дает неожиданный токен: / – phil

1

Использование Group By и Having статья. Отфильтруйте имена с отличным количеством gender - 1 в Having.

select name 
from Avatar 
Group by name 
Having count(distinct gender) = 1 

или

Having Min(gender) = Max(gender)