Um die gewünschten Daten zu erhalten, würde ich empfehlen, die Aggregation mit einem having
zu verwenden Klausel:
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;
Sie haben zwei Probleme mit Ihrem Ansatz. Erstens gibt die Unterabfrage entweder wahr oder falsch zurück und wirkt sich auf alle Zeilen in der ursprünglichen Abfrage aus. Sie wollen wirklich eine korrelierte Unterabfrage. Aber selbst wenn Sie das richtig verstanden hätten, würden Sie doppelte Zeilen für Mary zurückgeben. Dies löst beide Probleme.