2015-08-09 2 views
2

У меня есть две таблицы: игрок и игра. Я хотел бы вернуть список всех игроков независимо от того, сыграла ли их команда или нет. Я бы хотел, чтобы 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 

Я предполагаю, что это основной материал .. извините.

ответ

6

Ваше внешнее соединение заставляет внешнее соединение возвращаться во внутреннее соединение, потому что 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 
+0

В качестве альтернативы условие может быть изменен на 'COALESCE (b.round, 1) = 1 ' – Bulat

+0

@Bulat. , , Это тонко отличается. –

+0

@ GordonLinoff с точки зрения результата или каким образом? – Bulat