Player という名前の SQL テーブルと、Team という名前の別の SQL テーブルがあります。
- 各プレーヤーは、外部キーを介してチームに属している必要があります
TeamID
。 - 各チームは、再帰フィールドを介して別のチームに属することができます
ParentTeamID
。
だからそれは(トップダウン)...
- チームA
- チームB
- チーム76
- グループ8
- Player_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 (無限再帰) になることができますが、プレイヤーは 1 つのチームにしか所属できません。
データ構造 チーム: TeamID (PK)、名前、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」を持っていることを示す必要があります。