我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎么进行SQL问题的诊断

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

免责声明:

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

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

怎么进行SQL问题的诊断

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎么进行电脑内存诊断

本篇内容主要讲解“怎么进行电脑内存诊断”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么进行电脑内存诊断”吧!1.这项是Windows系统中专门针对内存的自检功能,在任务栏的Cortana搜索栏
2023-06-28

win7系统怎么解决诊断网络提示诊断策略服务未运行问题

这篇文章主要为大家展示了“win7系统怎么解决诊断网络提示诊断策略服务未运行问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“win7系统怎么解决诊断网络提示诊断策略服务未运行问题”这篇文章吧。
2023-06-28

PL/SQL中的性能怎么诊断与优化

在PL/SQL中,性能问题通常可以通过以下方法进行诊断与优化:使用Explain Plan:使用Oracle数据库的Explain Plan工具可以帮助分析SQL语句的执行计划,从而找出执行效率低下的地方。使用PL/SQL Profiler
PL/SQL中的性能怎么诊断与优化
2024-05-07

SpringBoot怎么打印mybatis的执行sql问题

这篇文章主要介绍了SpringBoot怎么打印mybatis的执行sql问题的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么打印mybatis的执行sql问题文章都会有所收获,下面我们一起
2023-07-05

如何使用调试诊断工具排查IIS中进程CPU使用率过高的问题

要使用调试诊断工具来排查IIS中进程CPU使用率过高的问题,可以按照以下步骤进行操作:1. 确认问题:首先,需要确认是否真的存在进程CPU使用率过高的问题。可以通过查看任务管理器或性能监视器来获取进程的CPU使用率。2. 定位问题:使用II
2023-09-08

VS2003 Include的垃圾问题怎么进行全面剖析

VS2003 Include的垃圾问题怎么进行全面剖析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。希望我的一点经验能给大家带来帮助,导致VS2003 Include出错的原因
2023-06-17

怎么进行SAP document builder常见问题的解答分析

怎么进行SAP document builder常见问题的解答分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。如果要想把DOCX render成PDF 格式,需要serv
2023-06-04

Mybatis的sql注释问题怎么解决

这篇文章主要介绍“Mybatis的sql注释问题怎么解决”,在日常操作中,相信很多人在Mybatis的sql注释问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Mybatis的sql注释问题怎么解决
2023-07-02

Java中怎么安全的进行SQL拼接

在Java中进行SQL拼接时,最好使用预编译语句(Prepared Statement)来执行SQL语句,这样可以避免SQL注入攻击。使用预编译语句时,可以使用占位符(placeholder)来代替实际的参数值,然后再通过设置参数的方式将
Java中怎么安全的进行SQL拼接
2024-04-29

ocssd进程的问题该怎么解决

ocssd进程的问题该怎么解决,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。有关ocssd进程的问题解决: 昨天有一个数据库的用户提出,在数据库服务器上的/var/lo
2023-06-04

mybatis中的动态sql问题怎么解决

本篇内容主要讲解“mybatis中的动态sql问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis中的动态sql问题怎么解决”吧!Mybatis框架的动态SQL技术是一种根据
2023-07-05

在SQL Server里怎么进行页级别的恢复

这篇文章跟大家分析一下“在SQL Server里怎么进行页级别的恢复”。内容详细易懂,对“在SQL Server里怎么进行页级别的恢复”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅读后能够对大家有所帮助。下面跟着小编一起深入学习
2023-06-17

编程热搜

目录