2015-02-19 2 views
0

У нас есть таблица Лиги, и теперь мы хотим, чтобы начислялась лига (когда лига заканчивается, начинайте ее с самого начала). Предлагаемое решение было просто добавить 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 сохраняется вдоль цепи. А затем просто верните все лиги с этим RolloverChainId в порядке даты или Id или что-то еще.

Есть ли лучший способ связывания цепочки идентификаторов?

ответ

1

SQL Server может делать recursive queries, и существуют различные способы моделирования связанных списков, но вам действительно нужно? Не могли бы вы использовать другой подход и иметь таблицу определения лиги, содержащую постоянную информацию (то есть имя лиги), а затем таблицу лиги-экземпляра, в которой содержатся сведения для каждого экземпляра лиги (т. Е. Дата начала и окончания).

1

Это классическая проблема с SQL. У Oracle есть функция, чтобы сделать это чисто - это было давно, так как я использовал Oracle, и я не помню подробностей, но он есть.

Если вы не используете SQL-расширения, вы можете сделать это с помощью sproc или с кодом, вы просто не сможете сделать это с помощью одного запроса. Достаточно просто написать цикл, который снова вызывает запрос, подключая значение из предыдущего прогона. Вы можете сделать это с помощью sproc, так что это не многократные поездки к движку базы данных, если производительность является проблемой.

Смежные вопросы