首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何避免多次连接同一个表

如何避免多次连接同一个表
EN

Stack Overflow用户
提问于 2020-03-10 05:38:40
回答 2查看 49关注 0票数 0

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

团队

代码语言:javascript
运行
复制
...|Coachid | Playerid | Refid|
    --------------------------
...|   98    |  23    |  77    |

名字

代码语言:javascript
运行
复制
Id    | Name      |
--------------------
  98  |  Andy     |
  23  |  Charlie  |
代码语言:javascript
运行
复制
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
EN

回答 2

Stack Overflow用户

发布于 2020-03-10 05:50:00

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

替代方案包括:

1)一系列相关子查询-这是可以的,因为每个关系只返回一个值:

代码语言:javascript
运行
复制
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)条件聚合-使查询更加繁琐:

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2020-03-10 05:41:55

根据表的结构方式,您提供的方式是完成此操作的最佳方式。

然而,奇怪的是,您构建团队表的方式。

您可以将整个查询简化为一个连接,如果您的Team表只包含每个人的id,而在Name表中,您将拥有该id的id和角色/职位。

我想这是一个很好的例子,说明了正确构建表格结构的重要性。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60608704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档