フォーラムで発生する比較的難しい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以降のバージョンに適合する:
方法2、2000に適合する:
別の例として、SQL Server 2000トリガは、テーブルの更新を実現します.
だから、記録しておく必要があると思います.そうすれば、後でこのような問題にぶつかっても、そこから解答の考えを得ることができます.
トリガの問題、データ挿入時に、テーブルのデータを自動的に更新する
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
*/