多表关联出现重复记录,其他列值不符问题求助
关联三张表出现重复记录及日期值不符问题
我尝试关联3张表,却出现了重复记录,其中一个日期列存在值不符的情况。以下是各表的示例内容:
表A
| key1 | key2 | quant |
|---|---|---|
| 123zxc | abc123 | 1 |
| 456asd | def456 | 2 |
表B
| key1 | key2 | order_date |
|---|---|---|
| 123zxc | abc123 | 20230101 |
| 456asd | def456 | 20230101 |
表C
| key1 | key2 | delivery_date |
|---|---|---|
| 123zxc | abc123 | 20230201 |
| 456asd | def456 | 20230202 |
当前输出
| key1 | key2 | quant | order_date | delivery_date |
|---|---|---|---|---|
| 123zxc | abc123 | 1 | 20230101 | 20230201 |
| 456asd | def456 | 2 | 20230101 | 20230202 |
| 123zxc | abc123 | 2 | 20230101 | 20230202 |
| 456asd | def456 | 1 | 20230101 | 20230201 |
当前使用SQL
SELECT DISTINCT a.key1, a.key2, a.quant, b.order_date, c.delivery_date FROM tableA a INNER JOIN tableB b ON a.key1 = b.key1 AND a.key2 = b.key2 INNER JOIN tableC c ON a.key1 = c.key1 AND a.key2 = c.key2
理想输出应为2行,我尝试移除delivery_date列后结果为2行。请问是否需要为关联添加额外条件?注:最后2行是错误数据。
解决方案
出现重复记录的核心原因是关联后产生了笛卡尔积,虽然你提供的示例表中key1+key2是唯一组合,但实际数据中大概率存在某个表内同一key1+key2对应多条记录的情况(比如表C中同一键组合对应多个delivery_date,或表A中同一键组合对应多个quant值),导致关联时匹配出多余的结果。
你可以通过以下方式解决:
1. 用聚合函数提取唯一值
如果业务上key1+key2应该对应唯一的日期和数量,可通过聚合函数(如MAX/MIN)提取唯一值,配合分组去重:
SELECT a.key1, a.key2, a.quant, MAX(b.order_date) AS order_date, MAX(c.delivery_date) AS delivery_date FROM tableA a INNER JOIN tableB b ON a.key1 = b.key1 AND a.key2 = b.key2 INNER JOIN tableC c ON a.key1 = c.key1 AND a.key2 = c.key2 GROUP BY a.key1, a.key2, a.quant
2. 先对表C做去重处理
既然移除delivery_date后结果正常,说明问题出在表C的关联上,可先对表C的键组合和日期做去重,再执行关联:
SELECT DISTINCT a.key1, a.key2, a.quant, b.order_date, c.delivery_date FROM tableA a INNER JOIN tableB b ON a.key1 = b.key1 AND a.key2 = b.key2 INNER JOIN ( SELECT DISTINCT key1, key2, delivery_date FROM tableC ) c ON a.key1 = c.key1 AND a.key2 = c.key2
3. 清理重复数据(根源解决)
如果业务上key1+key2是唯一标识,需先清理三张表中的重复记录,删除同一键组合下的多余条目,再执行关联查询,从根源避免重复问题。
内容的提问来源于stack exchange,提问作者Nathanael Tom Aterado
相关产品推荐
相关产品推荐

