前言

相信大家都有所体会,无论何种语言,一旦看见代码中有重复性的代码则想到封装来复用,在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)

总结

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

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

mysql导入sql文件时 避开_利用SQL脚本导入数据到不同数据库避免重复的3种方法...相关推荐

  1. mysql把游标数据存入表中_利用Python爬股票数据并存入数据库Mysql

    直接上代码,小白也能爬股票......... import tushare as ts import mysql.connector import re,time #创建所有股票的表格以及插入每支股票 ...

  2. python股票数据库_利用Python爬股票数据并存入数据库Mysql

    直接上代码,小白也能爬股票......... import tushare as ts import mysql.connector import re,time #创建所有股票的表格以及插入每支股票 ...

  3. python处理nc文件并输出_利用python如何处理nc数据详解

    前言 这两天帮一个朋友处理了些 nc 数据,本以为很简单的事情,没想到里面涉及到了很多的细节和坑,无论是"知难行易"还是"知易行难"都不能充分的说明问题,还是& ...

  4. mysql转储导入错误_数据库MYSQL导入SQL文件时错误的解决方法(2种)

    从服务器数据库用navicate导出的.sql文件后再用navicate导入到本地的数据库中会出现若干条记录的错误: [Err] 1064 – You have an error in your SQ ...

  5. mysql 运行sql 编码_关于解决运行 sql 文件时, 找不到 MySQL 默认编码 utf8mb4 的问题...

    关于解决运行 sql 文件时, 找不到 MySQL 默认编码 utf8mb4 的问题 本人小白一名, 最近碰到了一个问题, 在 navicat 导入 MySQL 文件时, 报出 MySQL 找不到 u ...

  6. mysql导入数据库注释乱码_source命令 导入.sql文件时,中文乱码 或者是注释乱码...

    1.source命令 导入.sql文件时,中文乱码 或者是注释乱码 首先进入dos命令,进入mysql数据库,之后use 数据库:之后查看你的mysql数据库编码 如下命令:模糊查询变量charact ...

  7. 关于解决运行sql文件时,找不到MySQL默认编码utf8mb4的问题

    关于解决运行sql文件时,找不到MySQL默认编码utf8mb4的问题 参考文章: (1)关于解决运行sql文件时,找不到MySQL默认编码utf8mb4的问题 (2)https://www.cnbl ...

  8. 关于mysql连接jsp文件时出现Xxx Xxx cannot be resolved to a type的情况

    关于mysql连接jsp文件时出现Xxx cannot be resolved to a type的情况 原因有三: a.(可能是jdk版本问题 通常系统使用默认版本 解决办法是进项目配置设置,以及将 ...

  9. oracle 数据泵impdp导入dmp文件时更改用户及表空间方法

    oracle impdp导入dmp文件时更改用户及表空间方法 impdp默认导入expdp的dmp文件时,是需要建立相同名称的表空间及临时表空间的:而且会自动创建相同名称的用户名. 但是有时候我们想更 ...

最新文章

  1. JS 函数 函数递归
  2. 于其炒股,不如......
  3. 200912阶段一C++友元、运算符重载
  4. libcurl库进行http通讯网络编程
  5. crm——stark组件核心原理
  6. linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]
  7. java安全 ——JAAS(Java 认证和授权服务)开发指南
  8. SQLIntegrityConstraintViolationException: 异常解决
  9. 括号配对问题----栈模拟
  10. javascript语言扩展:可迭代对象(3)
  11. 运行中的linux备份系统盘,怎样使用ghost对linux进行系统备份?
  12. matlab2010b显示激活界面_【转】Matlab2010b许可证过期问题,反复提示激活
  13. 小度杀入《最强大脑》总决赛,除了阴谋论还有什么值得关注的?
  14. 模重复平方计算法的C实现
  15. 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式
  16. 新一代至强CPU加速GBase 8a MPP,GBase GCDW云数据仓库助力行业迎接数字化转型新挑战
  17. PROC PRINT过程
  18. 互联网、云计算之用户服务
  19. FPGA学习:Verilog基本语法
  20. 500左右降噪蓝牙耳机推荐,热门降噪蓝牙耳机排行榜推荐

热门文章

  1. Outlook 2003中HTML签名格式不正确。当转发或者回复时algin=left失效
  2. 深度学习多模态融合_多模态深度学习综述.PDF
  3. Intel ax200 WiFi6吞吐量测试
  4. excel 自动换行填充 日期
  5. python统计一句话单词个数_python 统计单词个数
  6. 防火墙无法打开,错误代码 0×80070422
  7. python循环同时满足2个条件_python(2)-条件判断、循环等
  8. 帝国CMS免签支付插件-易支付插件
  9. 2020C证(安全员)复审模拟考试及C证(安全员)模拟考试软件
  10. 巫师的总力量和【单调栈+前缀和的前缀和】