2016-04-17 172 views
0

這可能很簡單,但我不確定如何去做。 我有2個表匹配和玩家如何比較來自兩個不同表格的數據SQL

Players table 
------------- 
PlayerID  int 
PlayerName varchar(20) 
TeamID  int 
TeamName  varchar(10) 

Match table 
----------- 
MatchID   int 
Team1   varchar(20) 
Team2   varchar(20) 
MatchDate  date 

例如,對於我想從兩個隊列出所有球員的名字一個特定的匹配。

28/03/16 Liverpool vs Arsenal,我如何從玩家表中獲取玩家名?

任何你能告訴我的都會有幫助。

+1

已格式化的文章。問題仍然是質量很低,OP應該嘗試編輯並更詳細地介紹迄今爲止已有的查詢。 –

+0

刪除謝謝。 –

回答

0

而不是將團隊名稱作爲team1和team2存儲在您的匹配表中,請存儲其相應的團隊ID。

編輯:每個匹配應該是唯一的匹配ID,因此不需要日期篩選。

這可以幫助你找回使用查詢記錄:

select * from players a where exists(select 1 from match b where 
b.MATCH_ID= :match_id and (a.team_id=b.team1 OR 
a.team_id =b.team2)) 
0

match表獲取行。如果你不知道,如果是TEAM1利物浦阿森納或者,或TEAM2

SELECT m.matchid 
    FROM match m 
    WHERE m.date = TO_DATE('2016-03-28','YYYY-MM-DD') 
    AND m.team1 IN ('Liverpool','Arsenal') 
    AND m.team2 IN ('Liverpool','Arsenal') 
    AND m.team1 <> m.team2 

接下來,使該行的兩個副本,反之亦然......

SELECT m.matchid 
    FROM (SELECT 1 AS i UNION ALL SELECT 2) d 
    CROSS 
    JOIN match m 
    WHERE m.date = TO_DATE('2016-03-28','YYYY-MM-DD') 
    AND m.team1 IN ('Liverpool','Arsenal') 
    AND m.team2 IN ('Liverpool','Arsenal') 
    AND m.team1 <> m.team2 

的執行加盟的球員表,看起來像我們使用teamname列匹配。

SELECT CASE WHEN d.i = 1 THEN m.team1 ELSE m.team2 END AS teamname 
     , p.playername 
    FROM (SELECT 1 AS i UNION ALL SELECT 2) d 
    JOIN match m 
    ON m.date = TO_DATE('2016-03-28','YYYY-MM-DD') 
    AND m.team1 IN ('Liverpool','Arsenal') 
    AND m.team2 IN ('Liverpool','Arsenal') 
    AND m.team1 <> m.team2 
    LEFT 
    JOIN players p 
    ON p.teamname IN (m.team1, m.team2) 
    ORDER BY d.i, p.playerid 
+0

如果您只想要一個玩家列表,而不使用他們所在的團隊,則可以消除返回teamname的SELECT列表中的第一個表達式。您還可以刪除LEFT關鍵字以使其成爲內部聯接。但如果兩支球隊都沒有球員,這隻會有所作爲。) – spencer7593

相關問題