SQL получает значения левого соединения из левой таблицы

#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 спасибо .. и прокомментируйте мне ссылку на ваш новый вопрос.. итак, я тоже могу попытаться оценить этот вопрос