You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于非空判断关联同主表多列,将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 17:45:00