【问题标题】:Left Outer Join not returning expected result左外连接未返回预期结果
【发布时间】:2015-11-01 11:56:45
【问题描述】:

我有两张桌子:玩家和游戏。我想返回所有球员的名单,无论他们的球队是否参加比赛。如果他们的球队确实参加了比赛,我想要 game_id,否则替换为 NULL。

我以为这只是一个 LEFT OUTER JOIN,但它只返回实际玩过的玩家列表。

SELECT a.id, b.match_id 
FROM player a 
  LEFT OUTER JOIN game b ON a.team_id = b.home_team_id or a.team_id = b.away_team_id 
WHERE b.round = 1

我想这是基本的东西......对不起。

【问题讨论】:

    标签: sql postgresql join


    【解决方案1】:

    外部表上的where 条件将外部联接转回内部联接,因为where 仅适用于非空值,但在外部联接表中找不到匹配项的行将具有所有空值。

    您需要将 where 条件移动到连接条件中。

    SELECT a.id, b.match_id 
    FROM player a 
      LEFT OUTER JOIN game b 
         ON (a.team_id = b.home_team_id or a.team_id = b.away_team_id) 
        AND b.round = 1 
    

    【讨论】:

    • 或者条件可以更改为COALESCE(b.round, 1) = 1
    • @Bulat。 . .那是微妙的不同。
    • @GordonLinoff 在结果方面还是以什么方式?
    • @Bulat:它将处理game 中存在但round 为空的行与game 中不存在的行相同。如果round 被定义为NOT NULL 那就没有区别了。
    猜你喜欢
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    相关资源
    最近更新 更多