2010-07-13 68 views
0

我从触发器(FOR UPDATE)中的表中选择数据。我选择的某些行已被事务更新,该事务启动了触发器,而某些行不是。我想在数据集中的每一行写一个标志,这个值将被计算为“id IN(SELECT [id] FROM INSERTED)”。这个标志会显示,是否有更新的最后一笔交易。选择数据,将计算值设置为列

SQL中可能吗?

当然,我可以做2个独立的查询,有2个不同的条件,但是触发性能比较是真正的瓶颈......

+0

当你说[sql]的意思是[sql-server]吗?触发器在不同的DBMS风格中有所不同。 – APC 2010-07-13 01:59:39

+0

触发器只是上下文。问题是关于case/when/then/as语法。 – noober 2010-07-13 12:38:05

回答

1

下面是SQL Server的一个例子:

if object_id('TriggerTest') is not null 
    drop table TriggerTest 

create table TriggerTest (id int identity, name varchar(50), inLastUpdate bit) 

insert TriggerTest (name) values ('joe'), ('barrack'), ('george'), ('dick') 
go 
create trigger dbo.TriggerTestDelete 
on TriggerTest 
after update 
as begin 
    declare @date datetime 
    set @date = GETDATE() 

    update dbo.TriggerTest 
    set  inLastUpdate = 
       case when id in (select id from inserted) then 1 
         else 0 
       end 
end 
go 
update TriggerTest set name = name where id in (1,2) 
update TriggerTest set name = name where id in (1,3) 
select * from TriggerTest 

此打印:

id name  inLastUpdate 
1  joe   1 
2  barrack  0 
3  george  1 
4  dick  0