当前位置:Gxlcms > 数据库问题 > 通过SQL脚本导入数据到不同数据库避免重复导入三种方式

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

时间:2021-07-01 10:21:17 帮助过:17人阅读

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脚本导入数据到不同数据库避免重复导入三种方式

标签:end   区分   name   es2017   left join   sts   null   logs   第一个   

人气教程排行