我有一个用于存储比赛(游戏或任何你想要的名字)的桌子,目的是能够查看一个分区的支架。
这是表格:
CREATE TABLE [dbo].[Match]
(
[MatchID] [bigint] IDENTITY(1,1) NOT NULL,
[OrgDivisionID] [bigint] NOT NULL,
[MatchTimeLength] [bigint] NULL,
[ParentMatchID1] [bigint] NULL,
[ParentMatchID2] [bigint] NULL,
CONSTRAINT [PK_Match]
PRIMARY KEY CLUSTERED ([MatchID] ASC)
)
示例数据:
MatchID OrgDivisionID MatchTimeLength ParentMatchID1 ParentMatchID2
----------------------------------------------------------------------
1 1 180 NULL NULL
2 1 180 NULL NULL
3 1 180 NULL NULL
4 1 180 NULL NULL
5 1 180 1 2
6 1 180 3 4
7 1 180 5 6
(参与比赛的队员或队员的详细信息将存储在一个单独的表中,该表现在不相关。)
这个想法是,单个匹配可以来自零父匹配ID(在这种情况下,它是初始匹配/第一轮)或1或2个父匹配ID。
如果一场比赛只有1个父级匹配ID,则意味着该匹配是与一个“再见”的人与之前参加比赛的人产生的。
如果一场比赛有2个父级MatchID,则意味着该比赛是与之前参赛的两个人一起生成的。
我需要帮助的是一个查询,它将显示所有匹配的完整路径。例如,MatchID 1 - > MatchID 5 - > MatchID 7
任何帮助或建议都会很棒。感谢
答案 0 :(得分:1)
公用表表达式(CTE)最适合此任务。
;with cte as (
--anckor query
select MatchID,ParentMatchID1,ParentMatchID2, 1 lvl
from #match
where matchid = 1 --or other id
union all -- note: UNION ALL
--recursive query
select m.MatchID,m.ParentMatchID1,m.ParentMatchID2, lvl+1
from #match m
inner join cte on cte.matchid = m.ParentMatchID1 or cte.matchid = m.ParentMatchID2
)
--Get result from here
select * from cte