使用SQL合并两张表,仅保留表2存在ID对应全量产品数据
正确SQL实现方案
错误原因说明
你之前仅通过ID字段左连接产生重复数据,是因为同ID下表1和表2各有多条产品记录,仅按ID关联会生成笛卡尔积(比如ID=1表1有3条、表2有2条,仅按ID关联会得到3*2=6条重复数据)。
实现逻辑
满足你的需求需要两步:
- 过滤表1,仅保留ID在表2中存在的行(排除ID=2的行)
- 用ID + Product code两个字段作为联合关联条件左连表2,匹配Product tenure字段,确保每行表1数据最多匹配1行表2数据,避免重复
具体SQL代码
SELECT t1.ID, t1.`Product code`, t1.Spend, t2.`Product tenure` FROM table1 t1 -- 第一步:过滤仅保留表1中ID在表2存在的行 WHERE EXISTS ( SELECT 1 FROM table2 t2_sub WHERE t2_sub.ID = t1.ID ) -- 第二步:双字段关联取Product tenure,无匹配返回空 LEFT JOIN table2 t2 ON t1.ID = t2.ID AND t1.`Product code` = t2.`Product code`
如果你的数据库场景更适合用子查询取唯一ID的写法,也可以用下面的等价版本:
SELECT t1.ID, t1.`Product code`, t1.Spend, t2.`Product tenure` FROM table1 t1 INNER JOIN (SELECT DISTINCT ID FROM table2) t2_ids ON t1.ID = t2_ids.ID LEFT JOIN table2 t2 ON t1.ID = t2.ID AND t1.`Product code` = t2.`Product code`
以上两种写法返回结果完全符合你的预期:包含ID=1的3条数据、ID=3的2条数据,匹配到的Product tenure正常填充,无匹配的字段为空,没有重复数据。
内容的提问来源于stack exchange,提问作者user584534
相关产品推荐
相关产品推荐

