Внешнее объединение не отображает нужные (нулевые) строки - PullRequest
1 голос
/ 29 марта 2012

У меня есть таблица, которая содержит идентификаторы пользователей, идентификаторы периодов и кол-во:

User Period Qty
---- ------ ---
   1  11201   3
   1  11202   2
   1  11203   5
   2  11202   4
   2  11203   1

Примечание. Пользователь 2 начал работу в периоде 11202, поэтому у него нет строки для периода 11201

.

Мне нужно получить пользователей только с последнего периода ...

SELECT User FROM table WHERE Period = 11203

... и затем используйте эти идентификаторы пользователя в одной таблице, чтобы получить период 11201 и 11202 кол-во для обоих пользователей.

Проблема: Мне нужно увидеть (null) Кол-во для пользователя 2 в период 11201 . Вот так:

User Period    Qty
---- ------  -----
   1  11201      3
   1  11202      2
   2  11201 (null)
   2  11202      4

Я не могу понять запрос / объединение для его достижения. Пока у меня есть это, но, как и ожидалось, оно дает мне только 3 строки (Пользователь 1, Периоды 11201/11202 и Пользователь 2, Период 11202):

SELECT a.User, a.Period, a.Qty
FROM (SELECT User FROM table WHERE Period = 11203) b
LEFT JOIN table a
ON b.User = a.User
WHERE a.Period BETWEEN 11201 AND 11202

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

Ваше предложение where отфильтровывает строки, где a.Period равно нулю.Переместите его в предложение on:

LEFT JOIN table a
ON a.User = b.User
AND a.Period = p.Period
AND a.Period BETWEEN 11201 AND 11202

Или явно примите значения null:

WHERE a.Period is null OR a.Period BETWEEN 11201 AND 11202
1 голос
/ 29 марта 2012

Вам необходимо получить все требуемые периоды и сделать из них декартово произведение сначала с пользователями, а затем выполнить внешнее соединение с этим:

SELECT b.User, p.Period, a.Qty
FROM (SELECT User FROM table WHERE Period = 11203) b
CROSS JOIN (SELECT DISTINCT Period FROM table 
            WHERE Period BETWEEN 11201 AND 11202) p
LEFT JOIN table a
ON a.User = b.User
AND a.Period = p.Period

Обратите внимание, что SELECT необходимо получить User и Period из внешней таблицы, а не из внутренней, в противном случае все будет иметь значение null в строках, где отсутствует пользователь.

0 голосов
/ 29 марта 2012

Проверяли ли вы все различия между левыми / правыми и внешними / внутренними соединениями?http://dev.mysql.com/doc/refman/5.0/en/join.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...