alter trigger trig_FeedbackNumber_tDetaineesInfo
on tDetaineesInfo
for insert,delete,update
as
if exists(select 1 from inserted)
begin update room
set room.iNumber=t.number
from tPrisonRoom as room join 
(
select iPrisonRoomID,count(*) as number
from tDetaineesInfo
where iPrisonRoomID in(select iPrisonRoomID from inserted)
group by iPrisonRoomID
) as t
  on(room.OID=t.iPrisonRoomID)
end
if exists(select 1 from deleted)
begin select *
from tDetaineesInfo
where iPrisonRoomID in(select iPrisonRoomID from deleted)    select count(*)
from tDetaineesInfo
where iPrisonRoomID in(select iPrisonRoomID from deleted)

update room
set room.iNumber=t.number
from tPrisonRoom as room join 
(
select iPrisonRoomID,count(*) as number
from tDetaineesInfo
where iPrisonRoomID in(select iPrisonRoomID from deleted)
group by iPrisonRoomID
) as t
  on(room.OID=t.iPrisonRoomID)
end
输出的结果是:
1、多条记录内容
2、老显示1不知道怎么回事,请大侠们给予解答。

解决方案 »

  1.   


    谢谢回复,可是select *
        from tDetaineesInfo
        where iPrisonRoomID in(select iPrisonRoomID from deleted)    select count(*)
        from tDetaineesInfo
        where iPrisonRoomID in(select iPrisonRoomID from deleted)这两个语句的输出结果不相符啊。
      

  2.   

    楼主对tDetaineesInfo表执行了什么SQL?
      

  3.   


    谢谢回复,我就执行了:update tDetaineesInfo
    set vRe='1111'
    where oid=71
      

  4.   

    alter trigger trig_FeedbackNumber_tDetaineesInfo
    on tDetaineesInfo
    for insert,delete,update
    as
    IF @@ROWCOUNT>0
    begin
    UPDATE a
    SET iNumber=t.number
    FROM tPrisonRoom AS a
    INNER JOIN  (SELECT iPrisonRoomID,count(*) as number FROM tDetaineesInfo AS a  
    WHERE EXISTS(SELECT 1 FROM DELETED WHERE iPrisonRoomID=a.iPrisonRoomID) OR EXISTS(SELECT 1 FROM INSERTED WHERE iPrisonRoomID=a.iPrisonRoomID)
    GROUP BY iPrisonRoomID) AS b ON a.OID=b.iPrisonRoomID
    END

    这样测测
      

  5.   


    --楼主既然tDetaineesInfo表执行了
       update tDetaineesInfo
           set vRe='1111'
           where oid=71--那
    select count(*)
        from tDetaineesInfo
        where iPrisonRoomID in(select iPrisonRoomID from deleted)
    --的结果就是聚合函数的集--而select *
        from tDetaineesInfo
        where iPrisonRoomID in(select iPrisonRoomID from deleted)--是所有符合条件的记录
    --当然不一样啊
      

  6.   

    =b.number--别名表改改
    alter trigger trig_FeedbackNumber_tDetaineesInfo
    on tDetaineesInfo
    for insert,delete,update
    as
    IF @@ROWCOUNT>0
    begin
        UPDATE a
        SET iNumber=b.number
        FROM tPrisonRoom AS a
            INNER JOIN     (SELECT iPrisonRoomID,count(*) as number FROM tDetaineesInfo AS a  
                            WHERE EXISTS(SELECT 1 FROM DELETED WHERE iPrisonRoomID=a.iPrisonRoomID) OR EXISTS(SELECT 1 FROM INSERTED WHERE iPrisonRoomID=a.iPrisonRoomID)
                            GROUP BY iPrisonRoomID) AS b ON a.OID=b.iPrisonRoomID
    END
      

  7.   

    谢谢你,我的意思是说,用了集合函数select count(*) 结果是1,可是select * 符合条件的记录确有10条。这个我不是很明白。
      

  8.   

    这样改,以上只是把楼主的语句简化了,这类判断没有意义,直接通过影响记录更新就行了alter trigger trig_FeedbackNumber_tDetaineesInfo
    on tDetaineesInfo
    for insert,delete,update
    as
    IF @@ROWCOUNT>0
    begin
        UPDATE a
        SET iNumber=ISNULL(b.number,0)
        FROM tPrisonRoom AS a
            LEFT JOIN     (SELECT iPrisonRoomID,count(*) as number FROM tDetaineesInfo AS a  
                            WHERE EXISTS(SELECT 1 FROM DELETED WHERE iPrisonRoomID=a.iPrisonRoomID) OR EXISTS(SELECT 1 FROM INSERTED WHERE iPrisonRoomID=a.iPrisonRoomID)
                            GROUP BY iPrisonRoomID) AS b ON a.OID=b.iPrisonRoomID
    WHERE EXISTS(SELECT 1 FROM DELETED WHERE iPrisonRoomID=a.iPrisonRoomID) OR EXISTS(SELECT 1 FROM INSERTED WHERE iPrisonRoomID=a.iPrisonRoomID)
    END