簡體   English   中英

如何避免多次加入同一個表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM