Получить значение из другой таблицы, если условие не выполнено - PullRequest
0 голосов
/ 31 октября 2018

Я пишу запрос SQL:

DECLARE @ResidentID AS INT = NULL
DECLARE @Category AS INT = NULL
DECLARE @ResidentStatus AS INT = NULL
DECLARE @Date AS DATETIME = NULL--'2018-02-27'

SELECT DISTINCT r.Firstname, r.Lastname, r.Active FROM Register.Resident r
LEFT JOIN Register.MonitoringStatusOfUser msu ON msu.ResidentID = r.ID
WHERE (r.ID = @ResidentID OR @ResidentID IS NULL)

Каждый резидент из Register.Resident 'r' имеет поле с именем 'Status', которое является целым числом. В таблице Register.MonitoringStatusOfUser у меня есть записи статусов для каждого пользователя, что-то вроде истории изменений статуса. Я хочу сделать следующее: проверить, есть ли запись для пользователя в Register.MonitoringStatusOfUser ' msu '. Если @Date находится между msu.DateFrom и msu.DateTo, отобразите msu.Status. Если нет, то отобразите r.Status.

Я уже сделал левое соединение для Register.MonitoringStatusOfUser. Однако я не могу понять, как отобразить r.Status, если не выполнено условие @Date, которое я объяснил выше.

1 Ответ

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

Я не уверен, нужен ли DISTINCT. Добавьте его обратно, если вам это нужно.

Условие даты можно указать в предложении ON. Затем используйте COALESCE(), чтобы получить желаемый статус:

SELECT r.Firstname, r.Lastname, r.Active,
       COALESCE(msu.status, r.status) as status
FROM Register.Resident r LEFT JOIN
     Register.MonitoringStatusOfUser msu
     ON msu.ResidentID = r.ID AND
        @Date BETWEEN msu.DateFrom AND msu.DateTo
WHERE (r.ID = @ResidentID OR @ResidentID IS NULL)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...