SQL查询排除HAZARD保险类型失效问题排查请求
问题排查与解决方案
你的查询无法过滤掉HAZARD类型记录,可能是以下原因导致,对应修正方案如下:
1. 大小写匹配问题
子查询中直接使用INSTYPDESC = 'HAZARD',如果实际数据里该字段值存在大小写差异(比如hazard、Hazard),会导致匹配失败,无法排除目标记录。
修正:用UPPER()统一大小写判断:
AND UPPER(INSTYPDESC) = 'HAZARD'
2. NOT IN的NULL陷阱
如果子查询SELECT ACCTNBR FROM EIS_DW.ACCTINSRECORDS ...返回的结果包含NULL值,NOT IN会直接失效——因为任何值与NULL比较都会返回未知,最终导致所有记录被保留。
更可靠的写法是改用NOT EXISTS,它不受NULL值影响:
AND NOT EXISTS ( SELECT 1 FROM EIS_DW.ACCTINSRECORDS AIR WHERE AIR.ACCTNBR = ACD.ACCOUNT AND AIR.EXPIREDATE IS NULL AND UPPER(AIR.INSTYPDESC) = 'HAZARD' AND AIR.PROD_DT = (SELECT MAX(CURR_DT) FROM EIS_DW.ACCTCOMMON) )
3. 日期字段匹配验证
确认子查询中的PROD_DT是否确实是与主查询CURR_DT对应的最新日期字段,如果两者含义不一致,会导致子查询无法找到对应记录,进而无法排除HAZARD类型数据。可以单独执行子查询,验证是否能返回正确的HAZARD类型账户列表。
修正后的完整查询
SELECT ACD.MAJOR_TYPE AS "Major Type Cd" , ACD.MINOR_TYPE AS "Minor Type Cd" , ACD.ACCOUNT AS "Account Nbr" , ACD.OWNER_NAME AS "Owner Name" , ACD.CONTRACT_DATE AS "Contract Dt" , ACD.ORIG_BAL AS "Original Balance" ,INSTYPDESC FROM EIS_DW.ACCTCOMMONLOAN ACD WHERE ACD.CURR_DT = (SELECT MAX(CURR_DT) FROM EIS_DW.ACCTCOMMON) AND UPPER(ACD.MINOR_TYPE) NOT IN ('7AP2','BSLC','CAIW','CSSF','PLFR','WCRS','WCRA','BSOF','BSOA','BSDF','BSLF','BSOL','BULA','BUFX','ACSF','ACSA','ACLF','ACFS','ACAS','7APP','XCLU','XLOC','WCAP','PLOC','PLOD','FFDU','CASF','PCFS','PCLD','PCUF','XCOL','XCLR','CMCF','CMCA','SFCF','SFCA','MFCF','MFCA','CSFX','CSAD','CCFX','CCAD') AND UPPER(ACD.ACCOUNT_STATUS) = 'ACT' AND NOT EXISTS ( SELECT 1 FROM EIS_DW.ACCTINSRECORDS AIR WHERE AIR.ACCTNBR = ACD.ACCOUNT AND AIR.EXPIREDATE IS NULL AND UPPER(AIR.INSTYPDESC) = 'HAZARD' AND AIR.PROD_DT = (SELECT MAX(CURR_DT) FROM EIS_DW.ACCTCOMMON) ) ORDER BY 3
内容的提问来源于stack exchange,提问作者BiGeek
相关产品推荐
相关产品推荐

