链接 ID 链(自引用 table)
Linking a chain of IDs (self referential table)
我们有一个联盟 table,现在想要滚动联盟的能力(当联盟结束时,从头开始重新开始)。建议的解决方案是将 RolloverLeagueID 添加到 table:
- 联赛编号
- 其他栏目
- 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
这显然不切实际。有什么方法可以递归查询这些信息吗?
我倾向于再添加一个 table,如下所示:
- RolloverChainId
- 上一个联赛编号
- NewLeagueId
上面有一个复合键,其中 RolloverChainId 沿着链持续存在。然后 return 所有具有该 RolloverChainId 的联盟,按日期、Id 或其他顺序排列。
是否有更好的链接 ID 链的方法?
SQL服务器可以做到recursive queries,链表的建模方式多种多样,但你真的需要吗?你能不能采取不同的方法,让一个联赛定义 table 包含不变的细节(即联赛名称),然后是一个联赛实例 table 包含每个联赛实例的细节(即开始和结束日期)。
这是 SQL 的经典问题。 Oracle 有一个功能可以干净地完成它 -- 我已经有很长时间没有使用 Oracle 了,我不记得细节了,但它就在那里。
失败 SQL 扩展,您可以使用存储过程或代码来完成此操作,但不能使用单个查询来完成。很容易编写一个不断再次调用查询的循环,插入前一个 运行 的值。您可以使用 sproc 来完成它,这样如果性能有问题,它就不会多次访问数据库引擎。
我们有一个联盟 table,现在想要滚动联盟的能力(当联盟结束时,从头开始重新开始)。建议的解决方案是将 RolloverLeagueID 添加到 table:
- 联赛编号
- 其他栏目
- 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
这显然不切实际。有什么方法可以递归查询这些信息吗?
我倾向于再添加一个 table,如下所示:
- RolloverChainId
- 上一个联赛编号
- NewLeagueId
上面有一个复合键,其中 RolloverChainId 沿着链持续存在。然后 return 所有具有该 RolloverChainId 的联盟,按日期、Id 或其他顺序排列。
是否有更好的链接 ID 链的方法?
SQL服务器可以做到recursive queries,链表的建模方式多种多样,但你真的需要吗?你能不能采取不同的方法,让一个联赛定义 table 包含不变的细节(即联赛名称),然后是一个联赛实例 table 包含每个联赛实例的细节(即开始和结束日期)。
这是 SQL 的经典问题。 Oracle 有一个功能可以干净地完成它 -- 我已经有很长时间没有使用 Oracle 了,我不记得细节了,但它就在那里。
失败 SQL 扩展,您可以使用存储过程或代码来完成此操作,但不能使用单个查询来完成。很容易编写一个不断再次调用查询的循环,插入前一个 运行 的值。您可以使用 sproc 来完成它,这样如果性能有问题,它就不会多次访问数据库引擎。