茶中茉莉 發表於 2023-8-21 00:00:00

利用SQL脚本导入数据到不同数据库避免重复的3种方法

<p>
        <span><strong>前言</strong></span></p>
<p>
        相信大家都有所体会,无论何种语言,一旦看见代码中有重复性的代码则想到封装来复用,在sql同样如此,若我们没有界面来维护而且需要经常进行的操作,我们会写脚本避免下次又得重新写一遍,但是这其中就涉及到一个问题,这个问题我开始也没太在意,直到某时某刻,老大看到我写的脚本后笑着问了一句,你的脚本可否重复执行,我懵逼了,很显然不能,如果不能避免这种情况发生,比如进行插入操作,当下次其他同事来执行其脚本时可能会插入重复数据,如果是在线上那就傻逼了,所以老大又给我上了一课,从此之后每次写脚本都加逻辑判断,是的,也就是可重复执行。</p>
<p>
        接下来讲讲最近项目中遇到的场景。</p>
<p>
        <span><strong>话题引入</strong></span></p>
<p>
        在国民成年人体质测试中需要计算成年年纪且体侧年龄为20-59岁,若当前日期未超过成年人出生日期则岁数减一,否则不减,例如一个成年人出生日期为1991-11-01,此时该成年人的体侧年龄为25岁,若为1991-10-01则体侧年龄为26岁,此为第一步。第二步则是分组,每个年龄阶段的人测试的项目不一样,即需要根据年龄进行分组,在体侧文档中分为3组,一组为男性20-39岁,一组为女性20-39,最后一组不分男女为40-59。最后我们需要做的是根据不同的年龄阶段和性别进行分组。</p>
<p>
        我们建立如下表。</p>
<p>
        <img title="利用SQL脚本导入数据到不同数据库避免重复的3种方法" alt="利用SQL脚本导入数据到不同数据库避免重复的3种方法" src="https://zhuji.jb51.net/uploads/img/202305/4a836528af4b1792e7e4c00e6538b4b5.jpg"></p>
<p>
        <img title="利用SQL脚本导入数据到不同数据库避免重复的3种方法" alt="利用SQL脚本导入数据到不同数据库避免重复的3种方法" src="https://zhuji.jb51.net/uploads/img/202305/bc229a427fa3966254e301315dc0304c.jpg"></p>
<p>
        由上我们可以看出有20-39岁的男性,也有20-39岁的女性。也有40-59岁的男性等,关键在于我们怎么利用sql根据国民成年人体质测试文档计算出上述成年人的实际年龄呢。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_730189">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">id ,</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql spaces">  </code><code class="sql plain">datediff(</code><code class="sql color2">year</code><code class="sql plain">, birthday, getdate()) </code><code class="sql keyword">as</code> <code class="sql plain">age ,</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql spaces">  </code><code class="sql keyword">name</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql keyword">from</code> <code class="sql plain">dbo.t1</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="利用SQL脚本导入数据到不同数据库避免重复的3种方法" alt="利用SQL脚本导入数据到不同数据库避免重复的3种方法" src="https://zhuji.jb51.net/uploads/img/202305/2657a8e5b1a4b26efa19da7e7ce070fa.jpg"></p>
<p>
        看到上述查询明显不正确,未到出生日期的人年龄并未减掉1,此时我们可以利用datepart函数,第一个参数指定为dayofyear,此参数表明指定日期到在这一年的天数,例如我们想要获取当前已经过了多少天。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_355081">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">datepart(dayofyear, getdate())</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="利用SQL脚本导入数据到不同数据库避免重复的3种方法" alt="利用SQL脚本导入数据到不同数据库避免重复的3种方法" src="https://zhuji.jb51.net/uploads/img/202305/d3b110c25c6a3b33641691c9f9089357.jpg"></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_435404">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">datepart(dayofyear, </code><code class="sql string">'2017-12-31'</code><code class="sql plain">)</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="利用SQL脚本导入数据到不同数据库避免重复的3种方法" alt="利用SQL脚本导入数据到不同数据库避免重复的3种方法" src="https://zhuji.jb51.net/uploads/img/202305/a6b1fc285d24fd2212920d183e83af2c.jpg"></p>
<p>
        我们通过出生日期的天数和当前日期的天数,若大于当前日期天数则说明生日还未到,否则减掉1。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_974249">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">select</code> <code class="sql plain">id ,</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql spaces">  </code><code class="sql plain">datediff(</code><code class="sql color2">year</code><code class="sql plain">, birthday, getdate())</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql spaces">  </code><code class="sql plain">- </code><code class="sql color2">case</code> <code class="sql keyword">when</code> <code class="sql plain">datepart(dayofyear, birthday) &gt; datepart(dayofyear,</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql spaces">                </code><code class="sql plain">getdate()) </code><code class="sql keyword">then</code> <code class="sql plain">1</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql spaces">    </code><code class="sql keyword">else</code> <code class="sql plain">0</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql spaces">   </code><code class="sql keyword">end</code> <code class="sql plain">age ,</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql spaces">  </code><code class="sql keyword">name</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="sql keyword">from</code> <code class="sql plain">dbo.t1</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="利用SQL脚本导入数据到不同数据库避免重复的3种方法" alt="利用SQL脚本导入数据到不同数据库避免重复的3种方法" src="https://zhuji.jb51.net/uploads/img/202305/f861d87e245aabcf08429f4866ea8120.jpg"></p>
<p>
        此时我们完成了年龄阶段的区分,下面我们再插入到另外一个数据库它test2中。 这里我能想到的是两种种方式,若还有其他欢迎补充。</p>
<p>
        <span><strong>left join ....is null</strong></span></p>
<p>
        我们利用左连接来进行插入,同时若重复的话则另外需要插入的表主键必定不为null,所以我们外加null判断则可以去除重复插入问题。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_41526">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">insert</code> <code class="sql keyword">into</code> <code class="sql plain">test2.dbo.t2</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql spaces">  </code><code class="sql plain">( userid ,</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql spaces">   </code><code class="sql plain">birthday ,</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql spaces">   </code><code class="sql plain">gender ,</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql spaces">   </code><code class="sql keyword">name</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql spaces">  </code><code class="sql plain">)</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql spaces">  </code><code class="sql keyword">select</code> <code class="sql plain">t1.id ,</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="sql spaces">    </code><code class="sql plain">t1.birthday ,</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="sql spaces">    </code><code class="sql plain">t1.gender ,</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="sql spaces">    </code><code class="sql plain">t1.</code><code class="sql keyword">name</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="sql spaces">  </code><code class="sql keyword">from</code> <code class="sql plain">dbo.t1 </code><code class="sql keyword">as</code> <code class="sql plain">t1</code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="sql spaces">    </code><code class="sql color2">left</code> <code class="sql color1">join</code> <code class="sql plain">test2.dbo.t2 </code><code class="sql keyword">as</code> <code class="sql plain">t2 </code><code class="sql keyword">on</code> <code class="sql plain">t1.id = t2.userid</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="sql spaces">  </code><code class="sql keyword">where</code> <code class="sql plain">t2.id </code><code class="sql keyword">is</code> <code class="sql color1">null</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <img title="利用SQL脚本导入数据到不同数据库避免重复的3种方法" alt="利用SQL脚本导入数据到不同数据库避免重复的3种方法" src="https://zhuji.jb51.net/uploads/img/202305/54787365203a9f96d45bebc7f400e723.jpg"></p>
<p>
        当再次执行时则返回受影响行数为0</p>
<p>
        <img title="利用SQL脚本导入数据到不同数据库避免重复的3种方法" alt="利用SQL脚本导入数据到不同数据库避免重复的3种方法" src="https://zhuji.jb51.net/uploads/img/202305/8cb37ee42e7be1aae8b470a93df876c1.jpg"></p>
<p>
        <span><strong>not exists/not in</strong></span></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightersql" id="highlighter_522438">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="sql keyword">insert</code> <code class="sql keyword">into</code> <code class="sql plain">test2.dbo.t2</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="sql spaces">  </code><code class="sql plain">( userid ,</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="sql spaces">   </code><code class="sql plain">birthday ,</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="sql spaces">   </code><code class="sql plain">gender ,</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="sql spaces">   </code><code class="sql keyword">name</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="sql spaces">  </code><code class="sql plain">)</code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="sql spaces">  </code><code class="sql keyword">select</code> <code class="sql plain">t1.id ,</code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="sql spaces">    </code><code class="sql plain">t1.birthday ,</code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="sql spaces">    </code><code class="sql plain">t1.gender ,</code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="sql spaces">    </code><code class="sql plain">t1.</code><code class="sql keyword">name</code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="sql spaces">  </code><code class="sql keyword">from</code> <code class="sql plain">dbo.t1 </code><code class="sql keyword">as</code> <code class="sql plain">t1 </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="sql spaces">  </code><code class="sql keyword">where</code> <code class="sql color1">not</code> <code class="sql plain">exists(</code><code class="sql keyword">select</code> <code class="sql plain">t2.userid</code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="sql spaces">     </code><code class="sql keyword">from</code> <code class="sql plain">test2.dbo.t2 t2</code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="sql spaces">     </code><code class="sql keyword">where</code> <code class="sql plain">t2.userid = t1.id)</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        <span><strong>总结</strong></span></p>
<p>
        本节我们讲述了利用写sql脚本避免重复插入问题,同时来讲述了如何根据出生日期查询实际年龄。</p>
<p>
        好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
        原文链接:http://www.cnblogs.com/CreateMyself/p/7617055.html</p>
頁: [1]
查看完整版本: 利用SQL脚本导入数据到不同数据库避免重复的3种方法