フォーラムで発生する比較的難しいsql問題:9(トリガトピック挿入データ自動更新テーブルデータ)

3141 ワード

最近、フォーラムの中で、多くの比較的に難しいsql問題に出会って、自分ですべて解決することができますが、数日後に発見して、覚えていないで、解決の方法も忘れました.
だから、記録しておく必要があると思います.そうすれば、後でこのような問題にぶつかっても、そこから解答の考えを得ることができます.
トリガの問題、データ挿入時に、テーブルのデータを自動的に更新する
http://bbs.csdn.net/topics/390634682 表1はフィールド1、フィールド2はデータ4行のフィールド1を挿入する  フィールド2 101 101 101 102フリップフロップでフィールド2を直接更新し、フィールド1を実現したい  フィールド2 101    101+1 102     102+1 101     101+2 102     102+2のような機能は、どのように実現するかを見てください.
データを挿入するときに、更新を実現します.
方法1、2005以降のバージョンに適合する:
--drop table tb

create table tb
(  1 int,     2 int,    3 int,    4 int)


drop trigger trigger_tb

create trigger dbo.trigger_tb
on tb
for insert
as

;with t
as
(
select tb.*,
       row_number() over(partition by tb.  1 order by tb.  4) as rownum
from tb 
inner join inserted i
        on tb.  1 = i.  1
           and tb.  3 = i.  3
           and tb.  4 = i.  4
)

update t
set   2 =   1+rownum

go


insert into tb
select 101,null,            1,      1
union all select 102,null,  1,      2
union all select 101,null,  1,      3
union all select 102,null,  1,      4


--  
select *
from tb
/*
  1	  2	  3	  4
101	    102	    1	    1
102	    103	    1	    2
101	    103	    1	    3
102	    104	    1	    4
*/

方法2、2000に適合する:
--drop table tb

create table tb
(  1 int,     2 int,    3 int,    4 int)


--drop trigger trigger_tb

create trigger dbo.trigger_tb
on tb
for insert
as

update tb
set   2 = t1.  1 + (select count(*) from tb t2 
                       where t2.  1 = t1.  1
                             and t2.  4 <= t1.  4)
from tb t1 
inner join inserted i
        on t1.  1 = i.  1
           and t1.  3 = i.  3
           and t1.  4 = i.  4

go


insert into tb
select 101,null,            1,      1
union all select 102,null,  1,      2
union all select 101,null,  1,      3
union all select 102,null,  1,      4


--  
select *
from tb
/*
  1	  2	  3	  4
101	    102	    1	    1
102	    103	    1	    2
101	    103	    1	    3
102	    104	    1	    4
*/

別の例として、SQL Server 2000トリガは、テーブルの更新を実現します.
--drop table mocta

create table purtb
(     varchar(10),     varchar(10),   varchar(50))

create table mocta
(     varchar(10),     varchar(10))


insert into purtb
select '101','201','301' union all
select '102','302','302' union all
select '103','  ','  '

insert into mocta
select '201','301' union all
select '202','302'
go

--drop trigger trigger_purtb_insert



create trigger dbo.trigger_purtb_insert
on purtb
for insert
as

update purtb
set    = isnull((select t1.    
                   from mocta t1 
                   where i.     = t1.    ),
                  i.    )
from inserted i
where purtb.     = i.     and
                  purtb.     = i.    
          

go


insert into purtb(    ,    )
select '104','201'
union all select '105','xxx'




--  
select *
from purtb
/*
    	    	  
101	    201	    301
102	    302	    301
103	      	      
104	    201	    301
105	    xxx	    xxx
*/