我有两个表,Table1列如下:
id surname level term pyear status
a1 peterson form1 first_term 2014 active
a2 chanaka form1 first_term 2014 active
Table2列与Table1非常类似,如下所示:
id surname level term pyear
表1主键:id
表2主键:(id,level,term,pyear)
这是场景,Table1记录只能插入一次,一旦插入,就可以更新记录,使得level,term和pyear可以更改,例如level和pyear同时更改,因为l只能升级记录从2014年到2015年,从form1到form2同时出现。至于术语,同一级别和年份可以有first_term,second_term和third_term。我必须每次从一个术语移动到另一个术语时运行上述查询,比如first_term到second_term,或者从一年到下一年,比如从2014年到2015年,然后将从form1更改为form2。运行查询时,Table1中的更新记录必须反映为Table2中新插入的记录。例如,假设Table1内容已经过以下更新:
Table1
id surname level term pyear status
a1 peterson form1 first_term 2014 active
a2 chanaka form1 first_term 2014 active
Table1
id surname level term pyear status
a1 peterson form1 second_term 2014 active
a2 chanaka form1 second_term 2014 active
Table1
id surname level term pyear status
a1 peterson form1 third_term 2014 active
a2 chanaka form1 third_term 2014 active
Table1
id surname level term pyear status
a1 peterson form2 first_term 2015 active
a2 chanaka form2 first_term 2015 active
对于表1中的上述转换,表2必须如下所示:
Table2
id surname level term pyear
a1 peterson form1 first_term 2014
a2 chanaka form1 first_term 2014
a1 peterson form1 second_term 2014
a2 chanaka form1 second_term 2014
a1 peterson form1 third_term 2014
a2 chanaka form1 third_term 2014
a1 peterson form2 first_term 2015
a2 chanaka form2 first_term 2015
我的问题是,只要表2中没有任何其他记录具有相同的级别,术语和年份,查询就只能插入到表2中。如果至少有一条记录具有相同的级别,期限和年份,则无论最近在表1中输入了其他记录,都不会插入它们。如果我试图删除'如果不存在'只要表2中没有任何具有相同级别,术语和年份的记录,它也会在Table2中插入记录,否则它会报告它不能基于主键插入然后终止。如何在不重复表2中的记录的情况下解决问题。
查询运行如下:
create proc sp_extract(
@level nvarchar(50),
@term nvarchar(50),
@pyear int
)
as
if not exists(select id,
surname,
level,
term,
pyear
from Table2 where level=@level and term=@term and pyear=@pyear)
insert into Table2
(
id,
surname,
level,
term,
pyear
)
select id,
surname,
level,
term,
pyear
from Table1 where level=@level and term=@term and pyear=@pyear