SQL行内多个同表外键值映射查询出现重复结果如何解决
多外键关联同一张表的多行映射实现
问题原因
你写的SQL有两个明显问题:
- 多次关联
Table2时没有给表设置独立别名,本身就不符合SQL语法规范,直接执行会发表名重复错误 - 逻辑方向错了:你当前写法是想把三个外键对应的品牌值作为三列返回,但你的需求是把三个外键对应的品牌拆成独立行,多表JOIN会生成笛卡尔积,自然会出现大量重复数据。
正确写法
核心思路是先把Table1中三个存储品牌ID的列,通过UNION ALL拆成多行的单品牌ID字段,再统一关联Table2取对应的品牌编码,写法兼容所有主流关系型数据库:
SELECT base.ID, base.EXTERNALCODE, t2.Brand_Code FROM ( SELECT ID, EXTERNALCODE, Brand_T AS brand_id FROM Table1 UNION ALL SELECT ID, EXTERNALCODE, Brand_E AS brand_id FROM Table1 UNION ALL SELECT ID, EXTERNALCODE, Brand_C AS brand_id FROM Table1 ) base LEFT JOIN Table2 t2 ON base.brand_id = t2.ID ORDER BY base.ID, t2.ID;
如果你使用的数据库支持UNPIVOT语法(SQL Server、Oracle、PostgreSQL 12+等),可以用更简洁的写法,效果和上面完全一致:
SELECT t1.ID, t1.EXTERNALCODE, t2.Brand_Code FROM Table1 UNPIVOT ( brand_id FOR brand_col IN (Brand_T, Brand_E, Brand_C) ) t1 LEFT JOIN Table2 t2 ON t1.brand_id = t2.ID ORDER BY t1.ID, t2.ID;
执行结果
运行上述语句后会返回完全符合预期的结果:
ID EXTERNALCODE Brand_Code 1 569859 eee 1 569859 465656 1 569859 456U99 2 545479 4OREFUOREFJ9 2 545479 465656 2 545479 r56
内容的提问来源于stack exchange,提问作者graphene
相关产品推荐
相关产品推荐

