2016-04-17 177 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

相关问题