链接 ID 链(自引用 table)

Linking a chain of IDs (self referential table)

我们有一个联盟 table,现在想要滚动联盟的能力(当联盟结束时,从头开始重新开始)。建议的解决方案是将 RolloverLeagueID 添加到 table:

我的问题是我们何时不可避免地要进行报告。您将如何展示联赛的完整历史?

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

这显然不切实际。有什么方法可以递归查询这些信息吗?

我倾向于再添加一个 table,如下所示:

上面有一个复合键,其中 RolloverChainId 沿着链持续存在。然后 return 所有具有该 RolloverChainId 的联盟,按日期、Id 或其他顺序排列。

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

SQL服务器可以做到recursive queries,链表的建模方式多种多样,但你真的需要吗?你能不能采取不同的方法,让一个联赛定义 table 包含不变的细节(即联赛名称),然后是一个联赛实例 table 包含每个联赛实例的细节(即开始和结束日期)。

这是 SQL 的经典问题。 Oracle 有一个功能可以干净地完成它 -- 我已经有很长时间没有使用 Oracle 了,我不记得细节了,但它就在那里。

失败 SQL 扩展,您可以使用存储过程或代码来完成此操作,但不能使用单个查询来完成。很容易编写一个不断再次调用查询的循环,插入前一个 运行 的值。您可以使用 sproc 来完成它,这样如果性能有问题,它就不会多次访问数据库引擎。