2016-11-29 67 views
0

我是相当新的使用SQL,也许有更好的方法来解释这个问题,但可以清楚地用下面的例子来描述...SQL在表中选择与其他表中的行数相匹配的行

在视频游戏数据库,我有多个帐户玩家表:

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 ByHaving子句。在Having子句中筛选具有不同计数的名称gender为1。

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

Having Min(gender) = Max(gender) 
相关问题