【问题标题】:Postgresql query with left join and having具有左连接并具有的 Postgresql 查询
【发布时间】:2014-09-03 15:19:43
【问题描述】:

Postgresql 9.1:我有一个查询,只有当两列的 聚合函数 SUM 大于零时,它才必须返回第二个表的值。

这是数据:

表 A

id   
---
1
2
3

表 b

id fk(table a)
---------------
1  1
2  null
3  3

表c

id  fk(table b) amount price
-----------------------------------
1   1             1     10   --positive
2   1             1     -10  --negative
3   3             2      5

如您所见,table b 有一些来自 table a 的 id,而 table c 可以有 1 个或多个对 的引用>table b, table c 只有当 sum(amount * price) > 0 时才会被检索到。

我写了这个查询:

SELECT 
    a.id, b.id, SUM(c.amount * c.price) amount 
FROM
    tablea a
LEFT JOIN 
    tableb b ON b.fk = a.id
LEFT JOIN 
    tablec c ON c.fk = b.id
GROUP BY 
    a.id, b.id
HAVING 
   SUM(c.amount * c.price) > 0

但是这个查询并没有从 table a 中检索所有行,只是 row 1 并且我需要这两行。我知道这是由于 HAVING 子句而发生的,但我不知道如何重写它。

谢谢。

编辑

预期结果

a    b     sum
------------------
1    null   null  -- the sum of 1 * 10 (rows 1 and two) = 0 so its not retrieved.
2    null   null   -- no foreign key in second table
3    3      10     -- the sum of 2 * 5 (row 3) > 0 so it's ok.

【问题讨论】:

  • 你能在 SQL fiddle 中创建这个吗??
  • 提供预期结果的示例。
  • 对不起我的无知,但是什么是小提琴?
  • 你不是按错键加入了吗?连接不应该在a.id = b.fk 等之间吗?
  • 您的查询缺少group by。您有一个 having 子句过滤掉了行,但似乎对此有所抱怨。您说“只有当总和(金额 * 价格)> 0 时才可以检索表 c”,但您不是从 table c 检索。而且,您的介绍性陈述是“两个字段的总和”,但没有任何字段被求和。请修正问题。期望的结果样本可以帮助您制定您真正想要的结果。

标签: sql left-join postgresql-9.1 psql having


【解决方案1】:

试试这个:

SELECT A.ID, B.ID, C.ResultSum
FROM TableA A
LEFT JOIN TableB B ON (B.FK = A.ID)
LEFT JOIN ( 
    SELECT FK, SUM(Amount * Price) AS ResultSum
    FROM TableC
    GROUP BY FK
) C ON (C.FK = B.ID) AND (ResultSum > 0)

查看演示here

【讨论】:

猜你喜欢
  • 2020-12-21
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-12
  • 1970-01-01
相关资源
最近更新 更多