У меня возникли проблемы с построением запроса, который бы выполнил что-то относительно простое.Простые левые соединения на одном столе
У меня есть одна таблица, которую мы можем назвать data
. В этой таблице есть столбец date
и столбец, который указывает записи как данные daily
или monthly
.
Я хочу получить все daily
записей, а также monthly
записей, в которых ежедневных записей не существует. Пример: если ежедневно запись 2016-01-10
существует, то я не хочу, чтобы получить ежемесячный отчет о 2016-01-01
Я чувствую, как этот следующий запрос должен достичь этой цели, но я не могу понять, почему он возвращает слишком много строк (дубликаты) и при дедуплировании не возвращает желаемый набор.
SELECT daily.*
FROM data daily
LEFT JOIN data monthly
ON date_trunc('month', daily.date) != date_trunc('month', monthly.date)
AND monthly.interval='monthly'
WHERE daily.interval='daily'
AND monthly.interval='monthly'
Предназначенное поведение, чтобы вернуть все записи из левых, ежедневных данных, а также присоединиться на условиях, в которых нет ежемесячных записей не возвращаются, которые имеют тот же месяц, как и любые ежедневные записи.
Но данные в каждой таблице то же самое, конечно, вы будете иметь записи, которые соответствуют в обоих , –
Когда LEFT JOIN, поместите условия правого бокового стола в предложение ON, чтобы получить истинное поведение левого соединения. (Когда в ГДЕ вы получаете регулярный результат внутреннего соединения.) – jarlh