前言

无论何种语言,一旦看见代码中有重复性的代码则想到封装来复用,在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 ,
Name
FROM 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 ,
Name
FROM 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)

总结

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

通过SQL脚本导入数据到不同数据库避免重复导入三种方式的更多相关文章

  1. C#与数据库的连接的三种方式

    学习了.net的知识从C#一直到MVC,我一直觉得基础很重要,最近有复习一下数据库连接的三种方式 1 返回结果集的一张表 public static DataTable ExecuteDataTabl ...

  2. redis数据库服务器开启的三种方式

    redis的启动方式1.直接启动  进入redis根目录,执行命令:  #加上‘&’号使redis以后台程序方式运行 1 ./redis-server & 2.通过指定配置文件启动  ...

  3. Java通过JDBC连接数据库的三种方式!!!并对数据库实现增删改查

    前言 java连接数据库完整流程为: 1,获得驱动(driver),数据库连接(url),用户名(username),密码(password)基本信息的三种方式. 2,通过获得的信息完成JDBC实现连 ...

  4. Sql 脚本文件太大 还原数据库

    sql脚本太大直接在数据库中执行会提示内存不足,我们看生成的脚本文件会发现每隔100条会有一个GO来分隔,这就好说了 在我将数据库的结构连同数据生成一个脚本文件db.sql 后,想在另外的电脑上恢复数 ...

  5. PHP如何通过SQL语句将数据写入MySQL数据库呢?

    1,php和MySQL建立连接关系 2,打开 3,接受页面数据,PHP录入到指定的表中 1.2两步可直接使用一个数据库链接文件即可:conn.php <?phpmysql_connect(&qu ...

  6. python 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)

    昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...

  7. oracle数据的导入导出(两种方法三种方式)

    大概了解数据库中数据的导入导出.在oracle中,导入导出数据的方法有两种,一种是使用cmd命令行的形式导入导出数据,另一种是使用PL/SQL工具导入导出数据. 1,使用cmd命令行导入导出数据 1. ...

  8. android sqlite使用之模糊查询数据库数据的三种方式

    android应用开发中常常需要记录一下数据,而在查询的时候如何实现模糊查询呢?很少有文章来做这样的介绍,所以这里简单的介绍下三种sqlite的模糊查询方式,直接上代码把: package com.e ...

  9. C#批量插入数据到Sqlserver中的三种方式

    本篇,我将来讲解一下在Sqlserver中批量插入数据. 先创建一个用来测试的数据库和表,为了让插入数据更快,表中主键采用的是GUID,表中没有创建任何索引.GUID必然是比自增长要快的,因为你生 成 ...

随机推荐

  1. jQuery方法输出有几个checkbox框被选中

    每选中一个多选框,输出有多少个选中 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

  2. python编码错误的解决办法 SyntaxError: Non-ASCII character '\xe5' in file

    [提出问题]. 在编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息: SyntaxError: Non-ASCII character '\xe5' in file ******* ...

  3. RGB转MIPI CSI芯片方案TC358746XBG

    型号:TC358746XBG功能:RGB888/666/565与MIPI CSI 互转通信方式:IIC/SPI分辨率:720p电源:3.3/1.2V封装形式:BGA72深圳有现货库存,价格有优势,样片 ...

  4. MongoDB副本集模式安装

    设备: 三个1G.20G.1核的虚拟机,系统是SentOS7 min 设置目录: Server1: mkdir -p /home/mongoshard/data/shard11 /home/mongo ...

  5. SVN 通过IIS设置反向代理访问

    原因 一个字,穷,没办法,只有一台机器 要当测试服务器还要做源码管理. 解决办法 通过IIS配置反向代理访问SVN,给SVN访问的HTTPS绑定上域名,就可以正常访问了. 1.修改SVN配置 把SVN ...

  6. 安装sklearn过程

    sklearn是scikit-learn的简称,诸多python工具包都需要这个库 安装顺序: wheel numpy scipy sklearn 因为这个库一直安装不好,都没有动力继续深造机器学习了 ...

  7. xcode模拟器不显示键盘解决方案

    当我们使用Xcode进行开发的时候,并不是所有的时候都需要将代码运行在iPhone,有时候模拟器就可以解决这些问题, 但是当你使用模拟器的时候会发现,在TextFiled中输入信息时,如果你是用模拟器 ...

  8. awk知识点全回顾

    本文目录:1.awk简介和基本语法格式2.print和printf格式化输出3.输入行的字段分隔符和行分隔符4.BGEIN和END5.数组6.流程控制语句 6.1 条件判断语句 6.2 while循环 ...

  9. JavaScript学习日志(五):DOM

    一,基本定义 DOM是针对HTML和XML文档的API,根据W3C的HTML DOM标准,html文档中所以内容(无论是元素还是标签还是注释还是元素属性)都是节点. 二,Node类型:每一个节点都含有 ...

  10. 关于Linux中cd的一些快捷用法

    cd 命令使用的一些小技巧 cd 进入主目录 cd ~ 同样进入主目录 cd - 返回当前目录之前所在的目录 cd .. 返回上级目录 cd ../.. 返回上级的上级目录 cd !$ 把上个命令的参 ...