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

简介:

前言

无论何种语言,一旦看见代码中有重复性的代码则想到封装来复用,在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脚本避免重复插入问题,同时来讲述了如何根据出生日期查询实际年龄。





本文转自Jeffcky博客园博客,原文链接:http://www.cnblogs.com/CreateMyself/p/7617055.html,如需转载请自行联系原作者

目录
相关文章
|
2天前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
17天前
|
关系型数据库 Shell 网络安全
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
1月前
|
SQL 数据库
数据库数据恢复—SQL Server报错“错误 823”的数据恢复案例
SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份不可用,那么就需要通过专业手段对数据库进行数据恢复。
|
15天前
|
SQL 关系型数据库 数据库连接
|
1月前
|
SQL 存储 关系型数据库
【SQL技术】不同数据库引擎 SQL 优化方案剖析
不同数据库系统(MySQL、PostgreSQL、Doris、Hive)的SQL优化策略。存储引擎特点、SQL执行流程及常见操作(如条件查询、排序、聚合函数)的优化方法。针对各数据库,索引使用、分区裁剪、谓词下推等技术,并提供了具体的SQL示例。通用的SQL调优技巧,如避免使用`COUNT(DISTINCT)`、减少小文件问题、慎重使用`SELECT *`等。通过合理选择和应用这些优化策略,可以显著提升数据库查询性能和系统稳定性。
95 9
|
2月前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
202 6
|
3月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
109 11
|
4天前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
9天前
|
关系型数据库 MySQL 数据库连接
docker拉取MySQL后数据库连接失败解决方案
通过以上方法,可以解决Docker中拉取MySQL镜像后数据库连接失败的常见问题。关键步骤包括确保容器正确启动、配置正确的环境变量、合理设置网络和权限,以及检查主机防火墙设置等。通过逐步排查,可以快速定位并解决连接问题,确保MySQL服务的正常使用。
123 82
|
2月前
|
关系型数据库 MySQL 数据库连接
数据库连接工具连接mysql提示:“Host ‘172.23.0.1‘ is not allowed to connect to this MySQL server“
docker-compose部署mysql8服务后,连接时提示不允许连接问题解决

热门文章

最新文章