执行 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
获得total
的SUM
第二个用Payments
得到amount
的SUM
。
然后加入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 时查询返回错误值?的主要内容,如果未能解决你的问题,请参考以下文章
left joinright join和inner join
left joinright join和inner join
两个 INNER JOIN ODBC MSAccess 异常与查询