sql - 如何避免多次加入同一个表
问题描述
在简化的示例中:想法是将所有(球员、教练和裁判)姓名纳入最终查询,但我能想到的唯一方法是在各自的 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
推荐阅读
- oauth - OAuth授权码流安全问题(授权码被黑客截获)
- laravel - Laravel 和 Vuejs 中的问题,部署到 Heroku
- php - 如何仅修复 php 的无效请求(不支持的 SSL 请求)?
- php - 如何在我的 wordpress 网站上进行分页
- numpy - TypeError:切片索引必须是整数或无或具有 __index__ 方法(Albumentations/NumPy)
- jquery - 如何修复我的(导航)按钮的响应性?
- sql - 动态显示会计年度 - SQL
- android - Android Studio“UsingOnClickInXml”警告
- python-3.x - Django中哨兵方法的用户是什么?
- excel - 是否可以从一个关闭的工作簿中提取或删除工作表而不打开它?