首页 > 解决方案 > 如何避免多次加入同一个表

问题描述

在简化的示例中:想法是将所有(球员、教练和裁判)姓名纳入最终查询,但我能想到的唯一方法是在各自的 ID 上加入 3 次。有什么更好的方法?

团队

...|Coachid | Playerid | Refid|
    --------------------------
...|   98    |  23    |  77    |

姓名

Id    | Name      |
--------------------
  98  |  Andy     |
  23  |  Charlie  |
SELECT [t].[Id],
       [t].[TeamName],
       [c].[Name] AS CoachName,
       [p].[Name] AS PlayeName,
       [r].[Name] as RefName
FROM Team [t]
JOIN Name [c]
ON c.id = t.Coachid
JOIN Name [p]
ON p.id = t.PlayerId
JOIN Name [r] 
ON r.id = t.RefId

标签: sql

解决方案


正如已经评论的那样,您的方法是处理您的案例的最佳方式,并且应该具有良好的性能。

替代方案包括:

1)一系列相关的子查询——这没关系,因为每个关系只有一个值要返回:

SELECT 
    t.Id,
   t.TeamName,
   (SELECT n.Name FROM AS Name n WHERE n.id = t.CoachId) CoachName,
   (SELECT n.Name FROM AS Name n WHERE n.id = t.PlayerId) PlayerName,
   (SELECT n.Name FROM AS Name n WHERE n.id = t.RefId) RefName
FROM Team t 

2) 条件聚合——使查询更加繁琐:

SELECT 
    t.Id,
    t.TeamName,
    MAX(CASE WHEN n.id = t.CoachId THEN n.Name END) CoachName,
    MAX(CASE WHEN n.id = t.PlayerId THEN n.Name END) PlayerName,
    MAX(CASE WHEN n.id = t.RefId THEN n.Name END) RefName
FROM Team t
INNER JOIN Name n ON n.id IN (t.CoachId, t.PlayerId, t.RefId)
GROUP BY t.Id, t.TeamName

推荐阅读