1. 首页 > 数据库技术

利用SQL脚本导入数据到不同数据库避免重复的3种方法

前言

相信大家都有所体会,无论何种语言,一旦看见代码中有重复性的代码则想到封装来复用,在sql同样如此,若我们没有界面来维护而且需要经常进行的操作,我们会写脚本避免下次又得重新写一遍,但是这其中就涉及到一个问题,这个问题我开始也没太在意,直到某时某刻,老大看到我写的脚本后笑着问了一句,你的脚本可否重复执行,我懵逼了,很显然不能,如果不能避免这种情况发生,比如进行插入操作,当下次其他同事来执行其脚本时可能会插入重复数据,如果是在线上那就傻逼了,所以老大又给我上了一课,从此之后每次写脚本都加逻辑判断,是的,也就是可重复执行。

接下来讲讲最近项目中遇到的场景。

话题引入

在国民成年人体质测试中需要计算成年年纪且体侧年龄为20-59岁,若当前日期未超过成年人出生日期则岁数减一,否则不减,例如一个成年人出生日期为1991-11-01,此时该成年人的体侧年龄为25岁,若为1991-10-01则体侧年龄为26岁,此为第一步。第二步则是分组,每个年龄阶段的人测试的项目不一样,即需要根据年龄进行分组,在体侧文档中分为3组,一组为男性20-39岁,一组为女性20-39,最后一组不分男女为40-59。最后我们需要做的是根据不同的年龄阶段和性别进行分组。

我们建立如下表。

利用SQL脚本导入数据到不同数据库避免重复的3种方法

利用SQL脚本导入数据到不同数据库避免重复的3种方法

由上我们可以看出有20-39岁的男性,也有20-39岁的女性。也有40-59岁的男性等,关键在于我们怎么利用sql根据国民成年人体质测试文档计算出上述成年人的实际年龄呢。

?
1
2
3
4
select id ,
  datediff(year, birthday, getdate()) as age ,
  name
from dbo.t1

利用SQL脚本导入数据到不同数据库避免重复的3种方法

看到上述查询明显不正确,未到出生日期的人年龄并未减掉1,此时我们可以利用datepart函数,第一个参数指定为dayofyear,此参数表明指定日期到在这一年的天数,例如我们想要获取当前已经过了多少天。

?
1
select datepart(dayofyear, getdate())

利用SQL脚本导入数据到不同数据库避免重复的3种方法

?
1
select datepart(dayofyear, '2017-12-31')

利用SQL脚本导入数据到不同数据库避免重复的3种方法

我们通过出生日期的天数和当前日期的天数,若大于当前日期天数则说明生日还未到,否则减掉1。

?
1
2
3
4
5
6
7
8
select id ,
  datediff(year, birthday, getdate())
  - case when datepart(dayofyear, birthday) > datepart(dayofyear,
                getdate()) then 1
    else 0
   end age ,
  name
from dbo.t1

利用SQL脚本导入数据到不同数据库避免重复的3种方法

此时我们完成了年龄阶段的区分,下面我们再插入到另外一个数据库它test2中。 这里我能想到的是两种种方式,若还有其他欢迎补充。

left join ....is null

我们利用左连接来进行插入,同时若重复的话则另外需要插入的表主键必定不为null,所以我们外加null判断则可以去除重复插入问题。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
insert into test2.dbo.t2
  ( userid ,
   birthday ,
   gender ,
   name
  )
  select t1.id ,
    t1.birthday ,
    t1.gender ,
    t1.name
  from dbo.t1 as t1
    left join test2.dbo.t2 as t2 on t1.id = t2.userid
  where t2.id is null

利用SQL脚本导入数据到不同数据库避免重复的3种方法

当再次执行时则返回受影响行数为0

利用SQL脚本导入数据到不同数据库避免重复的3种方法

not exists/not in

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
insert into test2.dbo.t2
  ( userid ,
   birthday ,
   gender ,
   name
  )
  select t1.id ,
    t1.birthday ,
    t1.gender ,
    t1.name
  from dbo.t1 as t1
  where not exists(select t2.userid
     from test2.dbo.t2 t2
     where t2.userid = t1.id)

总结

本节我们讲述了利用写sql脚本避免重复插入问题,同时来讲述了如何根据出生日期查询实际年龄。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

原文链接:http://www.cnblogs.com/CreateMyself/p/7617055.html

本文由主机测评网发布,不代表主机测评网立场,转载联系作者并注明出处:https://zhuji.jb51.net/shujuku/2879.html

联系我们

在线咨询:点击这里给我发消息

微信号:

工作日:8:30-17:30,节假日休息