#sql #postgresql #join #left-join
#sql #postgresql #Присоединиться #левое соединение
Вопрос:
Я работаю над сложным SQL-запросом. Просто для объяснения цели моей проблемы я сократил приведенный ниже короткий запрос:
select a.column1 as field1,b.column2 as field 2,c.column3 as field3,COALESCE(SUM(d.paid_amt) OVER (PARTITION BY a.some_column),0) as amount_paid
from a Inner join b on b.column3=ac.olumn2
right join c on c.column4=b.column1
left join d on d.column2=a.column1 and d.column5 = a.column1
where ...//some conditions
ИТАК, я совершенно уверен, что здесь происходит. Меня больше беспокоит последнее левое соединение в общей таблице. если в общей таблице нет записей, которые совпадают d.column5 = a.column1
, то я не получаю никаких результатов.
Но я пытаюсь написать запрос таким образом, что если d table возвращает какие-либо значения с условием where d.column5 = a.column1
, то я хочу использовать эти значения, или же, если в d table нет записей, я просто хочу получить записи из результата предыдущих соединений и получить записи, которые мне нужны.
Здесь с текущим запросом проблема, как и ожидалось, если соединение не соответствует условию where, оно удаляет все записи. Я хочу иметь записи независимо от того, удовлетворяет ли условие where или нет.
Я не совсем уверен, как это сделать в одном запросе. Приветствуются любые предложения.
Примечание: Ответ @scaisEdge и @Zaynul работает нормально. но проблема заключается в вычислении суммы, если я перемещаю условие в строку в предложении join and. Повторное вычисление также должно выполняться при том же условии d.column5 = a.column1
.Так что я не совсем уверен, как это преодолеть: (
Примерная дата ниже:
field1 | field2 | field3 | ampount_paid | some_column_to_match
--------------------------------------------------------------
name | value1 | other1 | 100 | 1
name1 | value2 | other2 | 100 | 1
name2 | value3 | other3 | 100 | 2
Итак, я только что добавил последние столбцы, чтобы объяснить, как я хочу получить сумму. Я хочу суммировать поля, только если some_column_to_match
совпадения. Итак, я пытаюсь получить вывод, подобный:
field1 | field2 | field3 | amount_paid | some_column_to_match
--------------------------------------------------------------
name | value1 | other1 | 200 | 1
name1 | value2 | other2 | 200 | 1
name2 | value3 | other3 | 100 | 2
Таким образом, в основном вычисление должно быть суммой всех значений в, amount_paid
где some_column_to_match
значение совпадает. Итак, в приведенном выше примере первые два столбца должны возвращать 200, поскольку это равно 100 в каждом отдельном поле для одного и того же значения.
Комментарии:
1. Не смешивайте
left join
иright join
. Я никогда не находил это полезным.
Ответ №1:
Если вы хотите левое соединение, то вам не следует использовать столбцы левой объединенной таблицы (d.column5 = a.column1) в условии where, таким образом, соединение стало внутренним соединением
В этом случае добавьте условие для столбцов, связанных с таблицей левого соединения, в соответствующем классе ON
select a.column1
,b.column2
,c.column3
,d.column4
from a Inner join b on b.column3=ac.olumn2
right join c on c.column4=b.column1
left join d on d.column2=a.column1 AND d.column5 = a.column1
Комментарии:
1. Спасибо, попробую это и опубликую результат здесь
2. Спасибо, это работает так, как ожидалось. Но это приводит к другой проблеме. Я соответствующим образом обновил вопрос. Я пытаюсь суммировать значения для некоторого столбца в общей таблице на основе некоторого условия. Это приводит к неправильным значениям, которые мне не нужны. Извините, если что-то непонятно, пожалуйста, дайте мне знать, я постараюсь исправить и объяснить это лучше.
3. Измените ответ, как только вы получили решение, это несправедливо.. SO не является сервисом кодирования. это сайт ответов на вопросы so .вместо изменения вы задаете вопрос.. вы должны должным образом оценить мой или другой правильный ответ и опубликовать свой новый вопрос в новом отдельном вопросе…..
4. Извините, я не хотел этого делать. Я просто изменил вопросы, поскольку чувствовал, что в первую очередь не объяснил вопрос должным образом. Это моя ошибка. Я могу вернуть вопрос и начать новую тему, если вы считаете, что так и должно быть. И, как уже было сказано, ваше первое решение было драгоценным камнем, и я ожидаю от первого поста. 🙁
5. @ging спасибо .. и прокомментируйте мне ссылку на ваш новый вопрос.. итак, я тоже могу попытаться оценить этот вопрос