查询产品及关联供应商:UNION的更优使用方法
更优的SQL实现方案
你当前的示例SQL存在小错误,字段之间遗漏了逗号,基础正确写法为SELECT code, supplier_1 AS supplier_id FROM products,再拼接UNION。更适配多供应商字段场景的实现方案有以下几种:
方案1:使用UNPIVOT语法(支持SQL Server、Oracle、PostgreSQL 10+等主流数据库)
是最简洁的实现方式,不需要重复编写多次SELECT语句,仅需列出所有供应商字段即可,维护成本极低:
SELECT code, supplier_id FROM products UNPIVOT ( supplier_id FOR supplier_column IN (supplier_1, supplier_2, supplier_3, supplier_4, supplier_5) ) AS unpivoted_result -- 若需过滤空的供应商关联,可补充下方条件 WHERE supplier_id IS NOT NULL;
方案2:使用VALUES行构造器(适配MySQL 8.0+、PostgreSQL、SQLite 3.39+等)
如果你的数据库不支持UNPIVOT语法,可以用该方案,比重复写UNION逻辑更易调整:
SELECT p.code, s.supplier_id FROM products p CROSS JOIN ( VALUES (p.supplier_1), (p.supplier_2), (p.supplier_3), (p.supplier_4), (p.supplier_5) ) AS s(supplier_id) WHERE s.supplier_id IS NOT NULL;
旧数据库兼容优化方案
如果你只能用兼容所有老旧数据库的写法,可以把你原方案中的UNION改为UNION ALL,性能会有明显提升:
UNION会对合并后的全量结果做全局去重,额外消耗大量计算资源- 只要同一个产品下的供应商ID不存在重复,直接用
UNION ALL即可,性能和上述两种方案几乎一致
内容的提问来源于stack exchange,提问作者Henrique Attilio
相关产品推荐
相关产品推荐

