Предыстория: у меня есть таблица в базе данных MS SQL, в которой перечислены компании и связанные с ними поставщики, а также их даты и даты.В каждой компании должен быть только один активный поставщик за один раз.
Структура таблицы следующая:
_sRID DataAreaID Supplier ApplicableFrom ApplicableTo
1 Comp1 Supplier1 2018-06-01 (NULL)
2 Comp2 Supplier2 2018-06-01 (NULL)
3 Comp3 Supplier3 2018-06-01 (NULL)
Где _sRID - это идентификатор.
Мой триггерэто так;
ALTER TRIGGER [trans].[ICOSupplierIDs_AutoEnd]
ON [trans].[ICOSupplierIDs]
AFTER INSERT,UPDATE
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
update base
set base.ApplicableTo = Getdate()
from trans.ICOSupplierIDs as base
join inserted as ins on ins.DataAreaID = base.DataAreaID
where base.ApplicableTo is null
and base._sRID != (select max(_sRID) from trans.ICOSupplierIDs where DataAreaID = ins.DataAreaID);
END
Таким образом, после вставки в таблицу для "comp1" таблица выглядит следующим образом:
_sRID DataAreaID Supplier ApplicableFrom ApplicableTo
1 Comp1 Supplier1 2018-06-01 2018-06-07
2 Comp2 Supplier2 2018-06-01 (NULL)
3 Comp3 Supplier3 2018-06-01 (NULL)
4 Comp1 Supplierx 2018-06-07 (NULL)
Есть ли более чистый способ сделать это, чем запрос концамаксимальной идентичности и снова ударить по столу?
TIA