2016-04-17 12 views
0

これは単純かもしれませんが、私はそれについてどうやって行くのかは分かりません。 は、私は両チームからのすべてのプレイヤー名をリストしたい特定の試合のために例えば2つのテーブルのマッチや選手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と言うと、Playersテーブルからプレーヤー名を取得するにはどうすればよいですか?

私に教えることがあれば何でも助けます。

+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 

...行の2つのコピーを作るわからない場合、私たちは一致する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

チームがまだ参加していないプレイヤーのリストのみが必要な場合は、チーム名を返すSELECTリストの最初の式を削除します。 LEFTキーワードを削除して、内部結合にすることもできます。しかし、それは両チームにプレーヤーがいなければ差が出るだろう。) – spencer7593