Это очень сложное и запутанное требование. Что произойдет, если Типы поправок IsActive различаются между моментом их загрузки в раскрывающийся список и моментом сохранения пользователем своей записи?
Игнорируя это, я бы порекомендовал таблицу, которая отображала бы комбинации в упорядоченном запятом списке. Очень редко мой ответ нарушает нормальные формы, но в противном случае это будет трудно.
Создайте таблицу с именем AmendmentTypeGroup:
create table AmendmentTypeGroup
(
AmendmentTypeGroupID int identity
,AmendmentTypes nvarchar(max) not null
,constraint PK_AmendmentTypeGroup primary key clustered(AmendmentTypeGroupID)
)
Добавьте столбец в таблицу изменений (не тип изменений):
alter table Amendmends add AmendmentTypeGroupID int null
Каждый раз, когда вы вставляете строку в Amendments
, используйте триггер или процедуру, чтобы убедиться, что вы сначала вставляете в AmendmentTypeGroup группу всех идентификаторов всех типов AmendmentType, которые на данный момент являются IsActive, получают идентификатор группы, а затем вставьте строку поправок с введенным значением группы. Если группа с определенной комбинацией уже была, просто захватите ее идентификатор и используйте его вместо этого.
declare @amendmentCombination nvarchar(max)
declare @groupID int
select amendmentCombination=string_agg(convert(nvarchar(max),AmendmentTypeID),',') WITHIN GROUP ( ORDER BY AmendmentTypeID asc)
from AmendmentType
where IsActive = 1 -- will only work for sql server version 2017. Search XML path concatenation if you don't have it
select @groupID=AmendmentTypeGroupID
from AmendmentTypeGroup
where AmendmentTypes=@amendmentCombination
if @groupID is null
begin
insert AmendmentTypeGroup(AmendmentTypes) select @amendmentCombination
set @groupID=SCOPE_IDENTITY() -- last id entered
end
insert Amendments(..your_other_columns...,AmendmentTypeGroup)
select ..your_other_columns...,@groupID
Таким образом, для каждой строки Amendment вы можете присоединить ее к AmendmentTypeGroup, чтобы получить разделенный запятыми список доступных AmendmentTypes в то время. Вам придется разделить его, чтобы принять в табличной форме.
Чтобы сделать ваши данные более надежными, вам следует: 1) вручную создать все группы AmendmentTypeGroup, которые использовались для уже существующих строк в поправках, и вставить их идентификаторы в Amendment.AmendmentTypeGroup, чтобы вы могли затем 2) создать FK для поправки .AmendmentTypeGroup со ссылкой на AmendmentTypeGroup.AmendmentTypeGroupID 3) создать уникальное ограничение для AmendmentTypeGroup.AmendmentTypes
Как видите, это сложно. Действуй осторожно.