Я пытаюсь выбрать максимальный идентификатор из любого числа n связанных кортежей в базе данных sql server - мы пишем скрипт обновления для некоторых наборов данных в приложении, и нам нужно знать, на чем основано максимальное доступное обновлениекакая версия данных в настоящее время.Например, используя следующую упрощенную таблицу «версии»:
oldVersionId newVersionId
1 2
2 3
3 4
10 11
Мы знаем, что мы версия 1, и хотим получить самую высокую версию, которую мы можем обновить;который в этом случае вернул бы 4, а не 11. У нас может быть 0-n доступных для обновления версий в любой момент времени.Я не sql wiz, и мог бы подумать только о том, чтобы запросить с использованием переменного числа связанных цепочек:
select newVersion from versions where oldVersionId = (select newVersion from versions where oldVersionId = 1)
Но это не пронумерованный поиск, и он не вернется правильно, если количество элементовбольше или меньше, чем данное.Способен ли sql выполнить такой запрос, и какие элементы / ключевые слова мне нужно искать, чтобы написать один?
Решение:
Вы узнаете что-то новое каждый день -Мне нужен был гибрид двух ответов.Оказывается, что sql может запрашивать набор данных, используя древовидную связь между дочерними и родительскими объектами, с которой мне гораздо удобнее работать на языках OO.
На сервере sql вы можете настроить рекурсивный обход по дереву с использованием таблицы с псевдонимами.,Вам нужен якорь, а затем рекурсивный бит.Первый вызов - это привязка, я могу использовать любое значение в таблице или список значений и т. Д. Второй вызов select просто говорит об использовании оставшейся части таблицы для сканирования.
Вотсинтаксис:
--Create the new alias (s)
;with s (oldVersionId, newVersionId) as
(
--set up the anchor node,
select oldVersionId, newVersionId from @t
where oldVersionId = 1
-- join it to the rest of the table, denoting that we only want nodes
-- where the old version is represented as a new version later
union all
select t.oldVersionId, t.newVersionId from @t as t
inner join s on t.oldVersionId = s.newVersionId
)
--Return the max value from the nodes I collected
select max(s.newVersionId) from s