【发布时间】:2017-04-04 11:05:33
【问题描述】:
我正在尝试获取属于活跃玩家以及电子邮件以“a”开头的玩家的头像的名称。
SELECT NAME
FROM AVATAR
INNER JOIN PLAYERAVATAR ON PLAYERAVATAR.PLAYER_ID = PLAYERAVATAR.AVATAR_ID
INNER JOIN PLAYER ON PLAYER.ACTIVE = 1;
我有这个,但它不起作用。我不是很擅长这个,所以任何帮助将不胜感激。谢谢你。
+-----------+--------------------+-----+--+---+--+
| AVATAR | | | | | |
+-----------+--------------------+-----+--+---+--+
| AVATAR_ID | NUMBER(38,0) | No | | 1 | |
| NAME | VARCHAR2(500 BYTE) | Yes | | 2 | |
| DOB | VARCHAR2(500 BYTE) | Yes | | 3 | |
| HOARD | NUMBER(38,0) | Yes | | 4 | |
| STRENGH | NUMBER | Yes | | 5 | |
| GENDER | VARCHAR2(500 BYTE) | Yes | | 6 | |
| SPECIES | VARCHAR2(500 BYTE) | Yes | | 7 | |
+-----------+--------------------+-----+--+---+--+
+-----------+--------------------+-----+--+---+--+
| PLAYER | | | | | |
+-----------+--------------------+-----+--+---+--+
| PLAYER_ID | NUMBER(38,0) | No | | 1 | |
| NAME | VARCHAR2(500 BYTE) | Yes | | 2 | |
| EMAIL | VARCHAR2(500 BYTE) | Yes | | 3 | |
| ACTIVE | NUMBER(38,0) | Yes | | 4 | |
| PASSWORD | VARCHAR2(500 BYTE) | Yes | | 5 | |
+-----------+--------------------+-----+--+---+--+
+--------------+--------------+-----+--+---+--+
| PLAYERAVATAR | | | | | |
+--------------+--------------+-----+--+---+--+
| PLAYER_ID | NUMBER(38,0) | Yes | | 1 | |
| AVATAR_ID | NUMBER(38,0) | Yes | | 2 | |
+--------------+--------------+-----+--+---+--+
【问题讨论】:
-
1. “我有这个,但它不起作用。”究竟什么不起作用? 2.“邮件以a开头的玩家”。我在您的查询中没有看到这样的标准。 3. NAME 存在于 AVATAR 和 PLAYER 中。您不想告诉 DBMS 您要显示两者中的哪一个吗?
-
您加入牌桌而不是使用
EXISTS或IN查找玩家有什么原因吗? -
一个玩家可以有多个头像,每个头像可以被多个玩家使用。但是您只想显示头像名称,对吗?如果一个头像被两个活跃玩家使用,你想显示头像名称一次或两次?
-
链接表是为了解决多对多的关系问题。一个玩家可以拥有多个头像,但一个头像不能被多个玩家拥有。
-
但是每个头像1个玩家不是多对多,而是一对多。您应该删除您的网桥表
PLAYERAVATAR并将PLAYER_ID添加到您的AVATAR表中。因此,您可以保证一致性(一个头像只能属于一个玩家)并使您的查询更加简单。
标签: sql inner-join