通过SQL脚本导入数据到不同数据库避免重复导入三种方式

来源:互联网 发布:mac 照片很大 找不到 编辑:程序博客网 时间:2024/06/08 02:32

前言

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

话题引入

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

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

SELECT  Id ,        DATEDIFF(YEAR, Birthday, GETDATE()) AS age ,        NameFROM    dbo.t1

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

SELECT DATEPART(dayofyear, GETDATE())

SELECT DATEPART(dayofyear, '2017-12-31')

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

复制代码
SELECT  Id ,        DATEDIFF(YEAR, Birthday, GETDATE())        - CASE WHEN DATEPART(DAYOFYEAR, Birthday) > DATEPART(DAYOFYEAR,                                                             GETDATE()) THEN 1               ELSE 0          END Age ,        NameFROM    dbo.t1
复制代码

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

LEFT JOIN ....IS NULL

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

复制代码
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  
复制代码

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

NOT EXISTS/NOT IN

复制代码
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)
复制代码
复制代码
INSERT  INTO test2.dbo.t2        ( UserId ,          Birthday ,          Gender ,          Name        )        SELECT  t1.Id ,                t1.Birthday ,                t1.Gender ,                t1.Name        FROM    dbo.t1 AS t1          WHERE t1.Id NOT in (SELECT t2.UserId                    FROM test2.dbo.t2 t2                   WHERE t2.UserId = t1.Id)
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 辞职后提成不发怎么办 老板给客户吵架员工该怎么办 冰柜声音大怎么办嗡嗡响 交了钱电没有怎么办 小白熊电动吸奶器显示F1怎么办 花洒的水变小了怎么办 手机插卡处坏了怎么办 吉利帝豪一键启动钥匙没电怎么办 居民医保断交5年怎么办 社保和医保断了怎么办 停缴了两年社保怎么办 医保交不够20年怎么办 医保断交4个月怎么办 医保断交5个月怎么办 换城市后社保卡怎么办 苹果6s呼叫失败怎么办 苹果手机打电话显示呼叫失败怎么办 苹果手机经常呼叫失败怎么办 苹果手机呼叫号码呼叫失败怎么办 好友把我拉黑了怎么办 有人一直打骚扰电话怎么办 每天都有骚扰电话怎么办 苹果7被电话轰炸怎么办 苹果手机接听声音小怎么办 微信账号封了怎么办 在京东买的手机出现问题怎么办 销售没胆量扫楼怎么办 骨龄比实际年龄小怎么办 身体年龄比实际年龄大怎么办 吃了不熟的鸡蛋怎么办 六角龙尾巴烂了怎么办 兰花长出来的包怎么办 长寿花花开败了怎么办 手机分期0首付怎么办办 办分期手机掉了怎么办 手机办分期被骗了怎么办 办手机分期年龄不够怎么办 信美分期没额度怎么办 家里人不给我钱怎么办 商场租金收不上来怎么办 魅蓝2电池坏了怎么办