执行 INNER JOIN 时查询返回错误值?

Posted

技术标签:

【中文标题】执行 INNER JOIN 时查询返回错误值?【英文标题】:Query returning wrong value when doing an INNER JOIN? 【发布时间】:2019-01-23 15:32:54 【问题描述】:

我想加入三个表来计算某个 (party_id) 的余额 = (purchase - payment):

派对(party_id、类型、名称) 采购(purchase_id、supplier_id、数量、费率、总计) 付款(payment_id、party_id、金额)

从该 id 购买的总金额 = 20,000,其总付款 = 15,000,因此其余额应为 = 5,000。使用此代码后:

SELECT 
    ((sum(purchase.total)) - (sum(payments.amount))) AS Party_Balance 
FROM 
    Purchase 
INNER JOIN 
    Party 
    ON purchase.supplier_id = party.party_id 
INNER JOIN 
    Payments 
    ON party.party_id = payments.party_id 
WHERE 
    payments.party_id = enter_party_id;

输出不正确:1,000,245 而不是 5,000。

这就是我建立关系的方式,是否存在应该修复的关系?

【问题讨论】:

哪个ID? WHERE 子句或其他地方没有 id。所以你已经包括了每一次购买。尝试选择所有列(用于测试),它应该更清晰。 问题是与这些实体相关的基数是什么。假设您有很多购买付款,那么购买总额会出现多次,并且 sum 函数将返回错误的数字。我建议你 select * 以了解 sum 实际处理的内容。 付款和购买都是与各方关系的多方面。这就是数据集如此庞大的原因。您应该执行两个聚合查询来汇总 Payments 和 Purchases GROUP BY party_id 和 supplier_id,然后将它们加入各方。 感谢您的回复。我select * 每条记录输出23次!这解释了输出中的大值,但现在我该如何解决这个问题?什么在复制它们? 【参考方案1】:

您必须对表 Party 进行 2 个单独的分组: 第一次使用Purchase 获得totalSUM 第二个用Payments 得到amountSUM。 然后加入2个子查询,得到Party_Balance

SELECT pur.party_id,  pur.total - pay.sumamount AS Party_Balance FROM (
  SELECT Party.party_id, SUM(Purchase.total) AS total
  FROM Party INNER JOIN Purchase ON Party.party_id = Purchase.supplier_id
  GROUP BY Party.party_id
) AS pur
INNER JOIN (
SELECT Party.party_id, SUM(amount) AS sumamount
  FROM Party INNER JOIN Payments ON Party.party_id = Payments.party_id
  GROUP BY Party.party_id
) AS pay
on pay.party_id = pur.party_id

【讨论】:

以上是关于执行 INNER JOIN 时查询返回错误值?的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql中的Inner Join子查询导致错误

left joinright join和inner join

left joinright join和inner join

两个 INNER JOIN ODBC MSAccess 异常与查询

带有 INNER JOIN 和 WHERE 的 SQL 查询

join,left join,inner join的区别?