[英]How to avoid joining the same table multiple times
在简化的示例中:想法是将所有(球员、教练和裁判)名称都放入最终查询中,但我能想到的唯一方法是在相应的 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
正如评论中所说,您的方法是解决您的案例的最佳方法,并且应该具有良好的性能。
替代方案包括:
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
根据您的表格的结构方式,您提供的方式是最好的方式。
但是,您构建 Team 表的方式很奇怪。
您可以将整个查询简化为一个连接,如果您让 Team 表只包含每个人的 id,并且在您的 Name 表中,您将拥有该 id 的 id 和角色/位置。
我想这是正确构建表格的重要性的一个很好的例子。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.