Как вернуть NULL в LEFT JOIN, когда критерии не дают результата для 2-й таблицы - PullRequest
0 голосов
/ 28 октября 2018

У меня есть таблица Account, которая имеет ноль-ко-многим Subscription, и я хочу вернуть Account.name и Subscription.end.

Если нет активной подписки, Subscription.end должно быть NULL.

Это мой (неправильный) SQL:

SELECT acc.name,
       s.t_end
FROM ACCOUNT acc LEFT JOIN SUBSCRIPTION s ON acc.id = s.account_id
WHERE acc.id = 1
  AND s.t_start <= CURRENT_TIMESTAMP()
  AND s.t_end > CURRENT_TIMESTAMP()

Проблема смой SQL: Если для учетной записи нет подходящей подписки, он вернет пустой набор:

acc.name | s.t_end
------------------
<nothing>

Что я хочу:

acc.name | s.t_end
------------------
1        | NULL

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Всякий раз, когда используется Left Join, если есть какие-либо условия Where в таблицах справа;это ограничит данные, и вы не получите все строки из самой левой таблицы по желанию.

Вместо этого вы можете переместить условия Where в таблицах правой стороны в соединение ON условие:

SELECT acc.name,
       s.t_end
FROM ACCOUNT acc 
LEFT JOIN SUBSCRIPTION s ON acc.id = s.account_id AND 
                            s.t_start <= CURRENT_TIMESTAMP() AND 
                            s.t_end > CURRENT_TIMESTAMP()
WHERE acc.id = 1

Кроме того, обычно рекомендуется ставить как можно больше условий в условия JOIN ON, поскольку это повышает удобочитаемость запросов.Также будет гораздо проще изменить эти запросы в случае изменения типа соединения.

0 голосов
/ 28 октября 2018

вы применяете условие where в таблице подписки, поэтому из-за условия where левое соединение ведет себя как внутреннее соединение.

Попробуйте убрать условие where, если вы не можете использовать ниже запрос-

SELECT acc.name,
       s.t_end
FROM ACCOUNT acc 
LEFT JOIN 
(select account_id,t_end from SUBSCRIPTION 
where 
     t_start <= CURRENT_TIMESTAMP()
and  t_end > CURRENT_TIMESTAMP()
) s
ON acc.id = s.account_id
WHERE acc.id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...