怎么进行SQL问题的诊断

网友投稿 439 2023-12-14

怎么进行SQL问题的诊断

这篇文章将为大家详细讲解有关怎么进行SQL问题的诊断,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

怎么进行SQL问题的诊断

问题 诊断 用户反应有一个员工不能设置他的考勤月历了。补充说明,我们员工上班都是按周一到周五上班,朝8晚5下班,但也有上三天晚班休息两天的上班制度,所以要设置

员工的上班制度。 而现在不能设置这个员工的上班制度了,那么这个员工也没法提交加班申请等操作了。而且快到工资结算的时候,如果不能及时提交考勤和加班等信息,就会影响

最后的工资发放。要及时处理这个问题,只好和开发人员一起查找正式系统上的日志。还好和开发人员一起梳理逻辑,很快就找到了可能有问题的SQL. 但此SQL执行正常不知道为什么会查询出

不需要的员工信息,这是查询出了这个员工不符合要求,所以系统才删除了这条不符合逻辑的数据

这是DBA介入调试此SQL,查找错误查询的原因。发现相关表中存在的数据如下

SELECT  APPNT_DATE

       ,APPNT_CD

       ,APPNT_SEQ

       ,ACTI_STTS_CD

FROM    MEMP_AP_APPNT_DET

WHERE   ten_id=T01

AND SITE_ID=EZ00

AND EMP_ID = 2F4EE7C0599E11E0B358975729707EA8

AND APPNT_DATE = 20180301;

APPNT_DATE  APPNT_CD  APPNT_SEQ ACTI_STTS_CD

20180301     AB         10         AA

20180301     DC         9          DA

20180301     YB         8          AA

程序会对这个表的APPNT_SEQ值求最大值,以此找出这天里员工的最后的状态值

但SQL中的查询条件是这样的

AND R.APPNT_DATE||R.APPNT_SEQ = (SELECT MAX(X1.APPNT_DATE||X1.APPNT_SEQ)

FROM MEMP_AP_APPNT_DET X1

                                 WHERE X1.TEN_ID = R.TEN_ID

                                   AND X1.SITE_ID = R.SITE_ID

                                   AND X1.EMP_ID = R.EMP_ID

AND X1.APPNT_DATE <= 20180329)

一看到|| 还做比较就感觉要出事,赶紧把这段SQL拿到生产环境执行了一把。查询出的数据中有不想要的数据。于是在 R.APPNT_DATE||R.APPNT_SEQ前面加TO_NUMBER()

再执行不想要的数据不见了。这说明 R.APPNT_DATE||R.APPNT_SEQ拼出的结果是字符类型,这种字符类型比较后和数字类型比较是有区别的       

比如201803019 > 2018030110 所以最大结果是201803019 , 而不是2018030110

最终修改后的SQL

                                SELECT N.TEN_ID

                                     , ...

                                  FROM TTNA_TBS_PERSN_MAS N

, MEMP_AP_APPNT_DET R -- CUR

                                     , MEMP_AP_APPNT_DET S -- PAST

                                 WHERE N.TEN_ID = T01

                                   AND N.SITE_ID = EZ00

AND N.EMP_ID = N.EMP_ID--NVL(null, N.EMP_ID)

                                   AND N.TEN_ID = R.TEN_ID

                                   AND N.SITE_ID = R.SITE_ID

                                   AND N.EMP_ID = R.EMP_ID

AND R.APPNT_DATE BETWEEN TO_CHAR(TO_DATE(20180329,YYYYMMDD)-100,YYYYMMDD) AND 20180329

                                   ...

AND TO_NUMBER(R.APPNT_DATE||R.APPNT_SEQ) = (SELECT MAX(TO_NUMBER(X1.APPNT_DATE||X1.APPNT_SEQ)) --update

FROM MEMP_AP_APPNT_DET X1

                                                                     WHERE X1.TEN_ID = R.TEN_ID

                                                                       AND X1.SITE_ID = R.SITE_ID

                                                                       AND X1.EMP_ID = R.EMP_ID

AND X1.APPNT_DATE <= 20180329)

AND TO_NUMBER(R.APPNT_DATE||R.APPNT_SEQ) > TO_NUMBER(S.APPNT_DATE||S.APPNT_SEQ)       --update

AND SUBSTR(NVL(R.ACTI_STTS_CD, ), 1, 1) <> SUBSTR(NVL(S.ACTI_STTS_CD, ), 1, 1) -- ?? ?? ??

AND TO_NUMBER(S.APPNT_DATE||S.APPNT_SEQ) = (SELECT MAX(TO_NUMBER(X2.APPNT_DATE||X2.APPNT_SEQ)) --update

                                                                      FROM MEMP_AP_APPNT_DET X2

                                                                     WHERE X2.TEN_ID = S.TEN_ID

                                                                       AND X2.SITE_ID = S.SITE_ID

AND X2.EMP_ID = S.EMP_ID

                                                                       AND X2.APPNT_DATE < R.APPNT_DATE)

                                  ...

总结 比较过程中字符串的比较和数字类型的比较是有很大区别的。这里不用过多的查看业务的逻辑,毕竟生产环境下的SQL 运行有一定保证,除非在某些特殊情况有一定问题,那么我们关注的是问题的细节,这里就是技术的细节。

关于怎么进行SQL问题的诊断就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:DG归档丢失场景下如何重新同步physical standby
下一篇:如何理解SQL优化中连接谓词推入
相关文章

 发表评论

暂时没有评论,来抢沙发吧~