Поскольку не все наборы текстов могут получать новые версии с одинаковой скоростью, нет реального способа сделать утверждение по номеру версии, который не должен был бы включать как идентификатор, так и источник.
Например, чтобы знать, что «5» - это последняя версия определенного текстового набора, вам нужно будет установить, что «6» не существует. Способ сделать это - посмотреть, есть ли строка с версией «6», которая имеет происхождение от строки с версией «5». Но это просто сводится к тому, чтобы найти строку, у которой нет другой строки, претендующей на то, что она является исходной точкой; вам не нужен номер версии.
Итак, вы можете перефразировать вопрос «есть ли у меня самый высокий номер версии», как «нет ли другой строки, в которой мой идентификатор указан в качестве источника». Если другой строки нет, то это ваша самая новая строка, и вы можете вернуть свой результат. Вы можете выполнить это с помощью следующего запроса:
select t.id
from table parent
left join table descendants on parent.id = descendants.origin
where descendants.id is null;
Единственными строками в итоговой объединенной таблице, в которой значение параметра downndant.id будет нулевым, являются самые новые. Обратите внимание, что оба родителя и потомки имеют псевдонимы из одной и той же таблицы. Это то, что называется «самостоятельным объединением», и его удобно делать, когда у вас есть иерархические данные (например, механизм управления версиями), хранящиеся в одной таблице.
Стоит отметить, однако, что это находит только самую новую версию для вас. Если вы хотите узнать , какая это версия, то вам определенно будет полезен столбец версии. В противном случае вам придется выполнять рекурсивный запрос, так как вы не будете заранее знать всю глубину списка версий. Никто не любит их писать.
Надеюсь, это поможет.