文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

怎么进行SQL问题的诊断

2024-04-02 19:55

关注

这篇文章将为大家详细讲解有关怎么进行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问题的诊断就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯