【问题标题】:Join query using three tables and display missing records使用三张表连接查询并显示缺失记录
【发布时间】:2022-01-23 17:33:03
【问题描述】:

我正在查询的数据库中有三个表:

玩家

Player_id Player_Name
1 Tom
2 Dick
3 Harry

游戏

Game_id Game_Name
1 Tennis
2 Rugby
3 Cricket

Games_Players

game_id player_id Date_Played
1 2 2021-12-20
1 3 2021-12-20
2 3 2021-12-21
3 2 2021-12-22
3 3 2021-12-22

我想要一个返回玩家 ID、姓名、游戏名称和玩过的日期的查询。如果他们没有玩过游戏——比如 Tom (1) 和 Dick (2)——那么我想要 id、玩家名、游戏名和一个空值。

想要的结果

player_id player_name game_name Date_Played
1 Tom Tennis null
1 Tom Rugby null
1 Tom Cricket null
2 Dick Tennis 2021-12-20
2 Dick Rugby null
2 Dick Cricket 2021-12-22
3 Harry Tennis 2021-12-20
3 Harry Rugby 2021-12-21
3 Harry Cricket 2021-12-22

我尝试了以下查询,这是我能得到的最接近的查询,并且我尝试了其他联接,但我似乎无法获得所需的所有数据:

SELECT players.player_id, players.player_name, games.game_name, Games_Players.Date_Played,
FROM players
LEFT OUTER JOIN Games_Players
LEFT OUTER JOIN games
ON players.player_id = Games_Players.player_id
AND Games_Players.game_id=games.game_id

它没有返回我需要的所有记录。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您似乎没有为表Game_Players 添加第一个连接的列。 此外,在选择部分的最后一列之后有一个逗号。因此,您的查询应该是:

    SELECT players.player_id, 
    players.player_name, 
    games.game_name, 
    Games_Players.Date_Played
    FROM players
    LEFT OUTER JOIN Games_Players 
    ON players.id = Games_Players.player_id
    LEFT OUTER JOIN games
    ON players.player_id = Games_Players.player_id
    AND Games_Players.game_id=games.game_id
    

    【讨论】:

      【解决方案2】:

      使用cross joinplayers 表连接到games 表,然后将结果连接到Games_Players

      select 
          t1.player_id,
          t1.player_name,
          t1.game_name,
          t2.Date_Played
      
      from
        (select * 
         from players p
         cross join games g) t1
      left join Games_Players t2
      on t1.Player_id = t2.Player_id and t1.game_id = t2.game_id
      

      db<>fiddle中的演示

      【讨论】:

        猜你喜欢
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-19
        • 2022-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多