【发布时间】:2018-04-17 08:40:18
【问题描述】:
我对加入三张桌子感到头疼。我重新创建了一个简单的测试用例,在其中看到了同样的问题,所以看起来我在连接查询中犯了一个根本性错误:
我有三张桌子:
case:
id (PK)| date_closed
155 | '2018-04-17 10:08'
156 | '2018-03-17 10:08'
pizza | '2018-02-17 10:08'
registration:
id (FK) | source | quantity
155 | market | 300
155 | sawdust| 200
bagged:
id | case_id (FK) | kg_bagged
X | 155 | 123
Y | 155 | 90
我想加入这些表格来比较数量列和 kg_bagged 中每个“案例”的总金额。所以 case 表与其他两个表有 1:* many 的关系。因此我做了一个这样的连接查询:
SELECT case.id,
date_closed,
SUM(quantity),
SUM(kg_bagged),
SUM(kg_bagged)/SUM(quantity) AS reduction_factor
FROM case
JOIN bagged ON case.id = bagged.case_id
JOIN registration ON case.id = registration.id
我认为这将是一个正确的查询,但 Postgres 告诉我必须将 case.id, date_closed 添加到 group by 子句。所以我添加了这个:
GROUP BY case.id, date_closed;
此代码运行时没有错误,但在案例 155 处显示的数量为 1000,而不是预期的 500 (200+300)。仅当有超过 1 条记录时才会出现此行为。当仅将 1 个表加入案例表时,它也可以正常工作。有人可以看到在 JOIN 查询中犯的错误吗?
我也尝试使用子查询来连接两个表,而不是在左侧表上使用连接,但它给了我类似的结果
【问题讨论】:
-
它会导致连接到另外 2 个表上的 2 行的笛卡尔效应,总共创建 4 行。 (将您的预期答案从 500 加倍到 1000)
标签: sql postgresql join