如何关联两张表创建视图计算交易总价值,视图计算结果偏高如何修正
问题根因
你编写的视图出现计算结果偏大的核心问题是表关联逻辑错误:
- 你使用逗号分隔两张表做隐式连接,但没有添加
name字段的关联条件,触发了笛卡尔积:Items表的每一行都会和ItemsInTransactions表的每一行做全量拼接,假设Items表里有M个商品,每条交易记录都会被重复计算M次,最终求和结果自然远高于预期。 - 额外问题:你给表取的别名和字段名完全重名(Items表别名设为
price_for_each、ItemsInTransactions表别名设为amount),极易引发字段引用歧义;同时完全没必要加DISTINCT,GROUP BY t_id后每个交易ID本来就只会返回一行结果。
正确实现
使用INNER JOIN通过商品名称关联两张表,保证每条交易中的商品能匹配到自身对应的单价后再分组求和即可:
CREATE VIEW TransactionValue AS SELECT t_id, SUM(amount * price_for_each) AS value FROM ItemsInTransactions iit INNER JOIN Items i ON iit.name = i.name GROUP BY t_id ORDER BY t_id;
逻辑说明
- 先关联
ItemsInTransactions(交易商品条目表)和Items(商品信息表),通过外键name匹配,确保每个交易条目拿到的都是对应商品的单价 - 按交易ID
t_id分组,对每组内的商品数量*商品单价求和,就能得到对应交易的正确总价值
内容的提问来源于stack exchange,提问作者james B
相关产品推荐
相关产品推荐

