用于锦标赛的SQL Server查询匹配

时间:2016-06-02 20:39:07

标签: sql sql-server database

我有一个用于存储比赛(游戏或任何你想要的名字)的桌子,目的是能够查看一个分区的支架。

这是表格:

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

任何帮助或建议都会很棒。感谢

1 个答案:

答案 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