Я пытаюсь реорганизовать один из моих запросов, и я просто не делаю что-то совершенно правильно.рефакторинг postgres join vs except
Я хотел бы объединить два запроса и сделать один, но я смущен тем, как он работает с LEFT JOIN.
Все QuizMasters, которые имеют состояние "активный"
Минус (-)
QuizMasters, которые имеют "активный" событие на определенный день (не все QuizMasters имеют события только ~ 25%).
Определение
- Событие магазина
start_at
доу/WDAY для данного события, например, понедельник-воскресенье (хотя как DateTime, только WDAY и время актуальны).- События и QuizMasters имеют состояния, которые являются либо «активный» или нет.
Старый запрос (который данные верны)
SELECT first_name, last_name, email
FROM quiz_masters
WHERE quiz_masters.state = 'active' # (175 rows)
EXCEPT
SELECT first_name, last_name, email
FROM quiz_masters
LEFT JOIN events ON events.quiz_master_id = quiz_masters.id
WHERE quiz_masters.state = 'active'
AND EXTRACT(dow FROM events.start_at::timestamp::date) = 3 AND events.state = 'active'
GROUP BY first_name, last_name, email # (- 20 rows)
Всего 155 строк соответствует запросу.
Комбинированный запрос, который не работает
Я хотел бы объединить их в нечто вроде:
SELECT first_name, last_name, email
FROM quiz_masters
LEFT JOIN events ON events.quiz_master_id = quiz_masters.id
WHERE quiz_masters.state = 'active'
AND events.quiz_master_id IS null
OR (EXTRACT(dow FROM events.start_at::timestamp::date) <> 3 AND events.state = 'active')
GROUP BY first_name, last_name, email
144 строк (нет 11 строк)
Но я не знаю, как чтобы сохранить все строки от quiz_masters
, которые активны, но не имеют никакого события. Он все еще удаляет их. Может быть, мне нужно какое-то другое соединение?
«исключение» обычно может быть переписано как условие «не существует». –
mayby in missing rows condition '(extract ....)' is false И строки в событиях существуют? Вы текущий, где находится '(quiz_masters.state = 'active' И events.quiz_master_id IS null) ИЛИ (EXTRACT ...)' ie _no строки в событиях OR (dow <> 3 и events.state = active) – Mike
BTW ' ... left join events on ... где события. ... 'неправильно. Это фактически «внутреннее соединение», даже если вы выполняете проверку «events.quiz_master_id IS null». – Abelisto