我有一个名为 Player 的 SQL 表和另一个名为 Team 的 SQL 表。
- 每个玩家必须通过外键属于一个团队
TeamID
。 - 每个团队可以通过递归字段属于另一个团队
ParentTeamID
。
所以它可能是(自上而下)......
- A队
- B队
- Team76
- 组8
- 播放器_ME
我的问题是,如果给我一个玩家PlayerID
(那张桌子的 PK),那么获得顶级团队的最佳方式是什么?
到目前为止我的查询(获得所有团队):
WITH TeamTree
AS (
SELECT ParentTeam.*, Player.PlayerID, 0 as Level
FROM Team ParentTeam
INNER JOIN Player ON Player.TeamID = ParentTeam.TeamID
WHERE Player.PlayerID IN (SELECT * FROM dbo.Split(@PlayerIDs,','))
UNION ALL
SELECT ChildTeam.*, TeamTree.PlayerID AS PlayerID, TeamTree.Level + 1
FROM Team ChildTeam
INNER JOIN TeamTree TeamTree
ON ChildTeam.TeamID = TeamTree.ParentTeamID
)
现在虽然我认为这是开始的正确地方,但我认为可能有更好的方法。另外我有点卡住了!我尝试在连接中(在子查询中)使用 Level,但它没有用。
关于如何在树上工作并仅获得顶级细节的任何想法?
编辑:
ParentTeam 可以是 ParentTeam(无限递归),但 Player 只能属于一个 Team。
数据结构团队:TeamID (PK)、Name、ParentTeamID(递归字段)
玩家:PlayerID (PK)、姓名、TeamID (FK)
样本数据:
Team:
1, TeamA, NULL
2, TeamB, 1
3, Team76, 2
4, Group8, 3
Player:
1, Player_ME, 4
2, Player_TWO, 2
因此,使用上述数据,两个玩家都应该(在查询中)显示他们拥有 TeamA 的“TopLevelTeam”