Вот как я могу это смоделировать. Я пропустил таблицу ревизий и таблицу файлов, поскольку они должны быть достаточно понятны.
CREATE TABLE Revision_Files
(
start_revision_number INT NOT NULL,
end_revision_number INT NOT NULL,
file_number INT NOT NULL,
value INT NOT NULL,
CONSTRAINT PK_Revision_Files PRIMARY KEY CLUSTERED (start_revision_number, file_number),
CONSTRAINT CHK_Revision_Files_start_before_end CHECK (start_revision_number <= end_revision_number)
)
GO
Чтобы получить все значения для файлов определенной ревизии, вы можете использовать следующий запрос. Присоединение к таблице файлов с внешним соединением позволит вам получить те, которые не имеют определенного значения для этой ревизии.
SELECT
REV.revision_number,
RF.file_number,
RF.value
FROM
Revisions REV
INNER JOIN Revision_Files RF ON
RF.start_revision_number <= REV.revision_number AND
RF.end_revision_number >= REV.revision_number
GO
Предполагая, что я правильно понимаю, что вы хотите в третьем пункте, это позволит вам получить все ревизии, для которых определенный файл имеет определенное значение:
SELECT
REV.revision_number
FROM
Revision_Files RF
INNER JOIN Revisions REV ON
REV.revision_number BETWEEN RF.start_revision_number AND RF.end_revision_number
WHERE
RF.file_number = @file_number AND
RF.value = @value
GO