Skip to content

6.4 — 连接时警惕重复数据

你将学习

  • 如何在 SQL 中连接三个或更多表
  • 与 Excel 中使用多个 VLOOKUP 的比较
  • 语法和最佳实践

示例表

表 sales:

SaleIDProductIDAmount
1101120
210280
310150
410390

表 products:

ProductIDProductName
101Apples
101Apples
102Oranges
103Bananas

为什么会出现重复?

在 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 分析了