SQL查询如何避免为匹配多个条件重复关联同一张数据表?
解决方案
有仅需单次关联Territoryinfo表的实现方案,核心思路是通过IN条件一次性匹配两个地区名称,再用条件聚合拆分出对应ID,参考写法如下:
SELECT mt.Customer, MAX(CASE WHEN ti.Name = mt.CurrentTerritory THEN ti.ID END) AS CurrentTerritoryID, MAX(CASE WHEN ti.Name = mt.NewTerritory THEN ti.ID END) AS NewTerritoryID FROM MainTable mt INNER JOIN Territoryinfo ti ON ti.Name IN (mt.CurrentTerritory, mt.NewTerritory) GROUP BY mt.Customer, mt.CurrentTerritory, mt.NewTerritory
说明
- 单次JOIN通过
IN条件匹配主表两个地区字段对应的Territoryinfo记录,避免了重复关联同表 - 因为每个地区名称对应唯一ID,所以用
MAX/MIN这类聚合函数都可以正确提取ID,不会出现冲突 - 如果你使用支持
FILTER语法的数据库(如PostgreSQL),可以简化条件聚合的写法:
MAX(ti.ID) FILTER (WHERE ti.Name = mt.CurrentTerritory) AS CurrentTerritoryID, MAX(ti.ID) FILTER (WHERE ti.Name = mt.NewTerritory) AS NewTerritoryID
额外提醒
你问题里贴的两次关联的SQL写法存在语法错误,两次关联的表都用了别名ti会导致重名冲突,实际使用需要改成不同别名(比如ti1和ti2)才能正常执行。如果你的业务场景中Territoryinfo表数据量很小,其实两次关联的性能和单次关联差异不大,可以结合实际执行计划选择更合适的写法。
内容的提问来源于stack exchange,提问作者twmp
相关产品推荐
相关产品推荐

