這篇文章將為大家詳細(xì)講解有關(guān)怎么進(jìn)行SQL問(wèn)題的診斷,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
專(zhuān)注于為中小企業(yè)提供成都做網(wǎng)站、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)鎮(zhèn)坪免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
問(wèn)題 診斷 用戶(hù)反應(yīng)有一個(gè)員工不能設(shè)置他的考勤月歷了。補(bǔ)充說(shuō)明,我們員工上班都是按周一到周五上班,朝8晚5下班,但也有上三天晚班休息兩天的上班制度,所以要設(shè)置
員工的上班制度。 而現(xiàn)在不能設(shè)置這個(gè)員工的上班制度了,那么這個(gè)員工也沒(méi)法提交加班申請(qǐng)等操作了。而且快到工資結(jié)算的時(shí)候,如果不能及時(shí)提交考勤和加班等信息,就會(huì)影響
最后的工資發(fā)放。要及時(shí)處理這個(gè)問(wèn)題,只好和開(kāi)發(fā)人員一起查找正式系統(tǒng)上的日志。還好和開(kāi)發(fā)人員一起梳理邏輯,很快就找到了可能有問(wèn)題的SQL. 但此SQL執(zhí)行正常不知道為什么會(huì)查詢(xún)出
不需要的員工信息,這是查詢(xún)出了這個(gè)員工不符合要求,所以系統(tǒng)才刪除了這條不符合邏輯的數(shù)據(jù)。
這是DBA介入調(diào)試此SQL,查找錯(cuò)誤查詢(xún)的原因。發(fā)現(xiàn)相關(guān)表中存在的數(shù)據(jù)如下
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
而程序會(huì)對(duì)這個(gè)表的APPNT_SEQ值求最大值,以此找出這天里員工的最后的狀態(tài)值
但SQL中的查詢(xún)條件是這樣的
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')
一看到|| 還做比較就感覺(jué)要出事,趕緊把這段SQL拿到生產(chǎn)環(huán)境執(zhí)行了一把。查詢(xún)出的數(shù)據(jù)中有不想要的數(shù)據(jù)。于是在 R.APPNT_DATE||R.APPNT_SEQ前面加TO_NUMBER()
再執(zhí)行不想要的數(shù)據(jù)不見(jiàn)了。這說(shuō)明 R.APPNT_DATE||R.APPNT_SEQ拼出的結(jié)果是字符類(lèi)型,這種字符類(lèi)型比較后和數(shù)字類(lèi)型比較是有區(qū)別的
比如201803019 > 2018030110 所以最大結(jié)果是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)
...
總結(jié) 比較過(guò)程中字符串的比較和數(shù)字類(lèi)型的比較是有很大區(qū)別的。這里不用過(guò)多的查看業(yè)務(wù)的邏輯,畢竟生產(chǎn)環(huán)境下的SQL 運(yùn)行有一定保證,除非在某些特殊情況有一定問(wèn)題,那么我們關(guān)注的是問(wèn)題的細(xì)節(jié),這里就是技術(shù)的細(xì)節(jié)。
關(guān)于怎么進(jìn)行SQL問(wèn)題的診斷就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。