【发布时间】:2019-03-31 15:22:31
【问题描述】:
我正在处理一个复杂的 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 答案工作正常。但问题是如果我将条件移动到连接和子句中的数量计算。数量计算也应该在相同的条件下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。
【问题讨论】:
-
不要混用
left join和right join。我从来没有发现这很有用。
标签: sql postgresql join left-join