如果列可以實時計算,像下面這樣可以工作:
with cte as (
select *,
row_number() over (
partition by Quote_System, Quote_Date, Quote_ID
order by QuoteVersion desc
) as rn
from dbo.yourTable
)
select *, case when rn = 1 then 'Open' else 'Versioned' end as Quote_Status
from cte;
實質上,(Quote_System,Quote_Date,Quote_ID),我列舉降序版本的每個分組訂購。因此,第一個(即rn = 1
)是開放的,其餘的是版本化的。在實際使用中,我會在實際選擇中添加一個where子句,以便它有一個合理的表現。
如果你需要它被持久化並且Quote_Version是單調遞增的,我寧願在存儲過程中這樣做。像這樣:
create procedure dbo.insert_Quote (
@Quote_System varchar(20),
@Quote_Date date,
@Quote_ID varchar(20),
@Quote_Version int
)
as
begin
update dbo.yourTable
set Quote_Status = 'Versioned'
where Quote_System = @Quote_System
and Quote_Date = @Quote_Date
and Quote_ID = @Quote_ID
and Quote_Status <> 'Versioned';
insert into dbo.yourTable
(Quote_System, Quote_Date, Quote_ID, Quote_Version, Quote_Status)
values
(@Quote_System, @Quote_Date, @Quote_ID, @Quote_Version, 'Open');
end
如果你真的需要一個觸發器,我也可以想出類似的東西。但這是我最不喜歡的解決方案。