链接一系列ID(自我引用表)

时间:2015-02-19 07:40:17

标签: sql database-design sql-server-2012

我们有一个联赛表,现在想要能够推出联赛(当联赛结束时,从一开始就重新开始)。建议的解决方案是只向表中添加RolloverLeagueID:

  • LeagueId
  • 其他专栏
  • RolloverLeagueID

我的问题是,我们不可避免地要报道。你会如何展示一个联盟的完整历史?

SELECT
    *
FROM
    League AS L1
    LEFT OUTER JOIN League AS L2
        ON L1.Id = L2.Id
    LEFT OUTER JOIN League AS L3
    etc etc

这显然不实用。有没有办法以递归方式查询这些信息?

我倾向于添加另一张这样的表:

  • RolloverChainId
  • PreviousLeagueId
  • NewLeagueId

使用复合键,RolloverChainId沿着链保持不变。然后按照日期,Id或其他顺序返回所有具有RolloverChainId的联赛。

是否有更好的方法来链接ID链?

2 个答案:

答案 0 :(得分:1)

SQL Server可以recursive queries,并且有各种方法可以建模链接列表,但您真的需要吗?你能采取不同的方法,并拥有一个联盟定义表,其中包含不变的详细信息(即联赛名称),然后是一个联赛实例表,其中包含联盟每个实例的详细信息(即开始和结束日期)。

答案 1 :(得分:1)

这是SQL的典型问题。 Oracle有一个干净利落的功能 - 自从我使用Oracle以来已经很长时间了,我不记得细节,但它就在那里。

SQL扩展失败,您可以使用sproc或代码执行此操作,只是单个查询无法执行此操作。编写一个循环可以再次调用查询,插入上一次运行的值很容易。您可以使用sproc来实现它,因此如果性能问题,它不会多次访问数据库引擎。