2014-09-23 81 views
0

背景:对于SPRIDEN_id,sprhold_hldd_code可能具有一个或多个值或NO值。Oracle SQL - 不存在 - 字符串不存在于值列表中

,我需要选择SP.SPRIDEN_ID,SP.SPRIDEN_LAST_NAME,SP.SPRIDEN_FIRST_NAME,SR.SHRDGMR_SEQ_NO,SR.SHRDGMR_PROGRAM

凡(sh.sprhold_hldd_code = 'RH')不存在。

到目前为止,没有记录被返回。

我发现如果我在sh.sprhold_hldd_code ='Z'中放入一个不在可能值列表中的代码(如Z),那么它将返回结果。

DATA: (column names abbreviated) 
SPRIDEN_ID SPRIDEN_LAST SPRIDEN_FIRST SHRDGMR_SEQ_NO SHRDGMR_PROGRAM sh.sprhold_hldd_code 
100001  Smith   Sue   1    ALHE   RH 
100001  Smith   Sue   1    ALHE   AA 
100001  Smith   Sue   1    ALHE   BB 
100005  Conners  Tim   1    BUSN   RH 
100008  Occent   Mary   1    MATH   CC 
100008  Occent   Mary   1    MATH   AA 

Expected Results: Mary is the only record that does NOT have the RH code. 

SPRIDEN_ID SPRIDEN_LAST_NAME SPRIDEN_FIRST_NAME SHRDGMR_SEQ_NO SHRDGMR_PROGRAM 
100008  Occent    Mary    1    MATH    

虽然我没有收到任何结果。

CODE: 
Select SP.SPRIDEN_ID, SP.SPRIDEN_LAST_NAME, SP.SPRIDEN_FIRST_NAME, SR.SHRDGMR_SEQ_NO,   SR.SHRDGMR_PROGRAM 
from spriden SP 
join SHRDGMR SR on SP.SPRIDEN_PIDM = SR.SHRDGMR_PIDM 
join SPRHOLD SH on sp.spriden_pidm = sh.sprhold_pidm 
where SR.SHRDGMR_DEGS_CODE = 'PN' 
    and SR.SHRDGMR_TERM_CODE_GRAD >= '201489' 
    and sp.spriden_change_ind is NULL 
and not exists 
(select sh.sprhold_pidm 
from sprhold sh 
where sh.sprhold_hldd_code = 'RH') 

回答

3

为了得到你想要的数据,我会建议使用聚集了having条款:

Select SP.SPRIDEN_ID, SP.SPRIDEN_LAST_NAME, SP.SPRIDEN_FIRST_NAME, SR.SHRDGMR_SEQ_NO, 
     SR.SHRDGMR_PROGRAM 
from spriden SP join 
    SHRDGMR SR 
    on SP.SPRIDEN_PIDM = SR.SHRDGMR_PIDM join 
    SPRHOLD SH 
    on sp.spriden_pidm = sh.sprhold_pidm 
where SR.SHRDGMR_DEGS_CODE = 'PN' and 
     SR.SHRDGMR_TERM_CODE_GRAD >= '201489' and 
    sp.spriden_change_ind is NULL 
group by SP.SPRIDEN_ID, SP.SPRIDEN_LAST_NAME, SP.SPRIDEN_FIRST_NAME, SR.SHRDGMR_SEQ_NO, 
     SR.SHRDGMR_PROGRAM 
having sum(case when sh.sprhold_hldd_code = 'RH' then 1 else 0 end) = 0; 

你有两个问题,你的方法。首先是子查询返回true或false,并影响原始查询中的所有行。你真的想要一个相关的子查询。但是,即使你得到了正确的结果,你也会为玛丽返回重复的行。这解决了这两个问题。

+0

是的!这正是我所期待的。我知道有类似于NVL2(表达式1,表达式2,表达式3)的东西,但不是前面的空值!谢谢你:-) – 2014-09-23 19:42:34

1

你可以做小的变化,并尝试

and sh.sprhold_pidm not in 
(select sh.sprhold_pidm 
from sprhold sh 
where sh.sprhold_hldd_code = 'RH') 
+0

你的答案对于我在另一个更密集的脚本中遇到的问题起作用。谢谢!! – 2014-09-23 21:03:12

相关问题