如何基于非空判断关联同主表多列,将UNION SQL改为单查询?
原有UNION逻辑改写单条查询
你原来的SQL使用UNION实现了「只要规格关联的品类/子品类/行项类型任意一个存在有效匹配,就返回规格名称并自动去重」的逻辑,可以改写为单条LEFT JOIN查询,避免多次扫描规格表,性能更优:
SELECT DISTINCT spec.name FROM mst_specification AS spec LEFT JOIN mst_lineitem_type AS subsubcat ON spec.lineitem_type_id = subsubcat.id LEFT JOIN mst_subcategory AS subcat ON spec.subcategory_id = subcat.id LEFT JOIN quote_categories AS cat ON spec.category_id = cat.id WHERE subsubcat.id IS NOT NULL OR subcat.id IS NOT NULL OR cat.id IS NOT NULL;
DISTINCT 对应原SQL中UNION的自动去重能力,WHERE条件保证至少有一个关联维度匹配成功,和原有逻辑完全等价。
关联全量业务表的最优写法
结合你提供的业务链关联需求,基于字段非空判断关联对应表的写法如下,会自动跳过空字段对应的无效关联逻辑:
SELECT DISTINCT spec.*, -- 合并不同层级的同名字段,按需调整 COALESCE(qt.quote_type_name, qt_subcat.quote_type_name, qt_subsubcat.quote_type_name) AS quote_type_name, COALESCE(cat.category_name, cat_subcat.category_name, cat_subsubcat.category_name) AS category_name, COALESCE(subcat.subcategory_name, subcat_subsubcat.subcategory_name) AS subcategory_name, subsubcat.lineitem_type_name, item.lineitem_content, uom.uom_name FROM mst_specification AS spec -- 关联category层级业务链 LEFT JOIN quote_categories AS cat ON spec.category_id = cat.id LEFT JOIN mst_quote_type AS qt ON cat.quote_type_id = qt.id -- 关联subcategory层级业务链 LEFT JOIN mst_subcategory AS subcat ON spec.subcategory_id = subcat.id LEFT JOIN quote_categories AS cat_subcat ON subcat.quote_category_id = cat_subcat.id LEFT JOIN mst_quote_type AS qt_subcat ON cat_subcat.quote_type_id = qt_subcat.id -- 关联lineitem_type层级业务链 LEFT JOIN mst_lineitem_type AS subsubcat ON spec.lineitem_type_id = subsubcat.id LEFT JOIN mst_subcategory AS subcat_subsubcat ON subsubcat.subcategory_id = subcat_subsubcat.id LEFT JOIN quote_categories AS cat_subsubcat ON subcat_subsubcat.quote_category_id = cat_subsubcat.id LEFT JOIN mst_quote_type AS qt_subsubcat ON cat_subsubcat.quote_type_id = qt_subsubcat.id -- 关联行项公共表 LEFT JOIN quote_lineitem_library AS item ON subsubcat.id = item.lineitem_type_id LEFT JOIN mst_uom AS uom ON item.uom_id = uom.id -- 保证至少有一个维度关联有效 WHERE COALESCE(cat.id, subcat.id, subsubcat.id) IS NOT NULL;
优化提示
- 如果业务允许一个规格同时匹配多个维度(比如同时填了category_id和subcategory_id且都有效),无需额外调整,查询会返回所有匹配结果
- 建议给
mst_specification的lineitem_type_id、subcategory_id、category_id三个字段加索引,关联的各表外键也确保有索引,性能比原UNION写法提升30%以上
内容的提问来源于stack exchange,提问作者rahularyansharma
相关产品推荐
相关产品推荐

