2017-04-04 6 views
0

Ich versuche, den Namen der Avatare, die zu aktiven Spielern gehören und auch die Spieler, deren E-Mail mit "a" beginnt, zu bekommen.Holen Sie sich Daten mit inneren Join auf drei Tabellen

SELECT NAME 
FROM AVATAR 
    INNER JOIN PLAYERAVATAR ON PLAYERAVATAR.PLAYER_ID = PLAYERAVATAR.AVATAR_ID 
    INNER JOIN PLAYER ON PLAYER.ACTIVE = 1; 

Ich habe dies, aber es funktioniert nicht. Ich bin nicht wirklich gut darin, also würde jede Hilfe geschätzt werden. Vielen Dank.

+-----------+--------------------+-----+--+---+--+ 
| 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

1. "Ich habe dies aber es funktioniert nicht." Was genau funktioniert nicht? 2. "Spieler, deren E-Mail mit einem beginnt". Ich sehe solche Kriterien nirgends in Ihrer Anfrage. 3. NAME existiert sowohl in AVATAR als auch in PLAYER. Wollen Sie dem DBMS nicht mitteilen, welches der beiden Sie anzeigen möchten? –

+0

Gibt es einen Grund, warum du dich den Tischen anschliesst, anstatt Spieler mit 'EXISTS' oder' IN' nachzuschlagen? –

+0

Ein Spieler kann mehrere Avatare haben und jeder Avatar kann von mehreren Spielern benutzt werden. Aber du willst nur die Avatarnamen anzeigen, oder? Und wenn ein Avatar von zwei aktiven Spielern benutzt wird, möchten Sie den Namen des Avatars ein- oder zweimal anzeigen? –

Antwort

0

Sie können etwas tun:

SELECT 
    AVATAR.NAME 
FROM 
    AVATAR 
INNER JOIN 
    PLAYERAVATAR ON PLAYERAVATAR.AVATAR_ID = AVATAR.AVATAR_ID 
INNER JOIN 
    PLAYER ON PLAYER.PLAYER_ID = PLAYERAVATAR.PLAYER_ID 
WHERE 
    PLAYER.ACTIVE = 1 
AND 
    PLAYER.EMAIL LIKE 'a%' ; 

Falls Sie Einzigartige Avatar Namen auswählen möchten, können Sie DISTINCT verwenden, etwa so:

SELECT DISTINCT 
    AVATAR.NAME 
FROM 
    AVATAR 
INNER JOIN 
    PLAYERAVATAR ON PLAYERAVATAR.AVATAR_ID = AVATAR.AVATAR_ID 
INNER JOIN 
    PLAYER ON PLAYER.PLAYER_ID = PLAYERAVATAR.PLAYER_ID 
WHERE 
    PLAYER.ACTIVE = 1 
AND 
    PLAYER.EMAIL LIKE 'a%' ; 
0

Sie haben einen Fehler, da Spalte name mehr als tha ist n ein Tisch.

Sie sollten einen Alias ​​verwenden.

Try this:

SELECT 
    P.NAME 
FROM 
    AVATAR A 
INNER JOIN 
    PLAYERAVATAR PL ON PL.PLAYER_ID = A.PLAYER_ID 
INNER JOIN 
    PLAYER P ON P.ACTIVE = 1 AND P.PLAYER_ID = A.PLAYER_ID 
WHERE 
    SUBSTR(P.EMAIL, 1, 1) = 'a' 
0

Sie

select a.NAME  from AVATAR a 
    join PLAYERAVATAR pa on a.AVATAR_ID =pa.AVATAR_ID 
    join PLAYER p on pa.PLAYER_ID =p.PLAYER_ID 
    where p.ACTIVE = 1 and p.EMAIL  like 'a%' 

verwenden können, wenn Sie verschiedene Avatar-Namen möchten, können Sie

select distinct(a.NAME) 
+0

Danke, es hat funktioniert. Du bist ein Lebensretter. –

+0

Dies ist das gleiche wie @Satish Antwort (Sie nur Aliase hinzugefügt) ... – PawelCz

+0

@HamidHosseini: Wenn das funktionierte, überprüfen Sie bitte direkt auf die Antwort –

0

Aus unserer kurzen Diskussion in Ihre Anfrage Kommentarbereich verwenden es wird deutlich, dass Ihr Datenmodell den Anforderungen nicht wirklich entspricht. Du sagst, dass ein Avatar nur einem Spieler gehört. Speichern Sie die player_id im Avatar-Datensatz und legen Sie die Bridge-Tabelle ab.

 
+-----------+--------------------+-----+--+---+--+ 
| PLAYER |     |  | | | | 
+-----------+--------------------+-----+--+---+--+ 
| PLAYER_ID | NUMBER(38,0)  | No | | 1 | | 
| NAME  | VARCHAR2(500 BYTE) | Yes | | 2 | | 
| ...  |     |  | | | | 
+-----------+--------------------+-----+--+---+--+ 

+-----------+--------------------+-----+--+---+--+ 
| AVATAR |     |  | | | | 
+-----------+--------------------+-----+--+---+--+ 
| AVATAR_ID | NUMBER(38,0)  | No | | 1 | | 
| NAME  | VARCHAR2(500 BYTE) | Yes | | 2 | | 
| PLAYER_ID | NUMBER(38,0)  | No | | 3 | | 
| ...  |     |  | | | | 
+-----------+--------------------+-----+--+---+--+ 

Die Abfrage wird:

select name 
from avatar 
where player_id in 
(
    select player_id 
    from player 
    where active = 1 
    and email like 'a%' 
);