6.4 — 连接时警惕重复数据
你将学习
- 如何在 SQL 中连接三个或更多表
- 与 Excel 中使用多个 VLOOKUP 的比较
- 语法和最佳实践
示例表
表 sales:
SaleID | ProductID | Amount |
---|---|---|
1 | 101 | 120 |
2 | 102 | 80 |
3 | 101 | 50 |
4 | 103 | 90 |
表 products:
ProductID | ProductName |
---|---|
101 | Apples |
101 | Apples |
102 | Oranges |
103 | Bananas |
为什么会出现重复?
在 SQL 中连接表时,第一个表的每一行都会与第二个表中满足连接条件的每一行匹配。
如果任一表在连接列中有重复值,您可能会得到比预期更多的行。
示例:
假设您的 sales
表有多个相同 ProductID
的销售记录,而您的 products
表也有重复的 ProductID
值(可能是由于数据录入错误):
sql
SELECT s.SaleID, p.ProductID, p.ProductName, s.Amount
FROM sales s
INNER JOIN products p
ON s.ProductID = p.ProductID;
- 如果
products
表中同一个ProductID
有两行,该产品的每个销售记录将在结果中出现两次
如何诊断重复问题
- 在连接前检查连接列是否存在重复:
sql
SELECT ProductID, COUNT(*)
FROM products
GROUP BY ProductID
HAVING COUNT(*) > 1;
- 如果返回任何行,说明
products
表中存在重复键
如何防止或处理重复
- 强烈要求修改问题的根源,即数据质量问题:删除表中的重复行
- 确保连接列在至少一个表中是唯一标识符(主键)
- 最后的妥协:使用
SELECT DISTINCT
在结果中删除重复的行(但这仅仅粉饰了背后的数据问题)
关键要点
- 连接列中的重复值会意外增加结果行数
- 在连接前始终检查数据是否存在重复
- 使用唯一键进行可靠的连接
下一步
现在您了解了重复数据的风险,可以自信地连接表并构建健壮的 SQL 分析了