SQL получает значения левого соединения из левой таблицы - PullRequest
1 голос
/ 31 марта 2019

Я работаю над сложным 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. если в таблице d нет записей, соответствующих d.column5 = a.column1, то я не получаю никаких результатов.

Но я пытаюсь написать запрос таким образом, чтобы, если d-таблица повторяет какие-либо значения с условием where d.column5 = a.column1, тогда я хочу использовать эти значения, иначе, если в d-таблице нет записей, я просто хочу получить записи из результатов предыдущих объединений и получить нужные мне записи.

Здесь с текущим запросом проблема, как и ожидалось, если соединение не соответствует условию where, то все записи удаляются. Я хочу иметь записи независимо от того, удовлетворяет ли условие where или нет.

Я не совсем уверен, как это сделать в одном запросе. Любые предложения приветствуются.

Примечание: @scaisEdge и @Zaynul Answer работают отлично. но проблема заключается в вычислении суммы, если я перемещаю условие в строке при соединении и предложении. Расчет суммы также должен выполняться при том же условии 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 Ответ

0 голосов
/ 31 марта 2019

Если вы хотите левое соединение, вам не следует использовать столбцы левой объединенной таблицы (d.column5 = a.column1), где условие, таким образом, соединение становится внутренним объединением
В этих случаях добавьте условие длястолбцы, относящиеся к левой таблице соединений в соответствующем предложении 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
...