2013-04-15 3 views
1

У меня есть запрос, который извлекает информацию о пользователях. У пользователя может не быть ни одного, ни одного номера телефона. То, что я пытаюсь сделать, - это получить последний номер телефона пользователей (определенный номером seq), связанный с запросом с другими базовыми демографическими данными. Проблема, с которой я сталкиваюсь, заключается в том, что мой подзапрос возвращает null, что пользователи не отображаются в моем запросе. Как я могу обрабатывать нули в подзапросе, чтобы эти строки все еще возвращались?Запрос с подзапросом, который возвращает null

SELECT SPRIDEN.SPRIDEN_ID AS Student_ID , 
     saradap.SARADAP_APST_CODE , 
     saradap.SARADAP_PIDM , 
     spriden.spriden_first_name , 
     spriden.spriden_last_name , 
     saradap.saradap_program_1 , 
     spraddr.SPRADDR_STREET_LINE1 , 
     spraddr.spraddr_city , 
     spraddr.spraddr_zip , 
     spraddr.spraddr_stat_code , 
     saradap.SARADAP_APPL_DATE , 
     'Individual' AS Account_Name , 
     saradap.SARADAP_CAMP_CODE , 
     CONCAT(sprtele_phone_area, sprtele_phone_number) "Phone" , 
     sprtele_tele_code , 
     sorcont_ctyp_code , 
     sorcont_contact_date , 
     sorcont.sorcont_activity_date 
FROM saradap 
     LEFT JOIN spriden ON saradap.saradap_pidm = spriden_pidm 
     LEFT JOIN spraddr ON saradap.saradap_pidm = spraddr.spraddr_pidm 
     LEFT JOIN sprtele ON saradap.saradap_pidm = sprtele.sprtele_pidm 
     LEFT JOIN sorcont ON saradap.saradap_pidm = sorcont.sorcont_pidm 
WHERE spriden.spriden_change_ind IS NULL 
     AND (saradap.SARADAP_CAMP_CODE = 'D' 
       OR saradap.SARADAP_CAMP_CODE = 'JD' 
      ) 
     AND saradap.saradap_appl_date > SYSDATE - 15 
     AND spraddr.spraddr_seqno = (SELECT MAX(spraddr.spraddr_seqno) 
             FROM  spraddr 
             WHERE  saradap.SARADAP_PIDM = spraddr.spraddr_pidm 
            ) 
     AND sprtele_seqno = (SELECT MAX(SPRTELE_SEQNO) 
           FROM  SATURN.SPRTELE 
           WHERE  sprtele_pidm = saradap.saradap_pidm 
          ) 

ответ

1

Sebas получил меня часть пути есть здесь завершенная запрос. В итоге мне пришлось использовать CTE. Как замечание, я новый пользователь stackoverflow, как я могу отдать должное ответу за помощь в получении ответа?

with 
tel(sprtele_pidm, mx) as (SELECT sprtele_pidm, MAX(SPRTELE_SEQNO) as "mx" 
        FROM  SATURN.SPRTELE where saturn.sprtele.sprtele_tele_code ='CU' 
        GROUP BY sprtele_pidm 
       ) 
SELECT SPRIDEN.SPRIDEN_ID AS Student_ID, 
saradap.SARADAP_APST_CODE, 
saradap.SARADAP_PIDM, 
spriden.spriden_first_name, 
spriden.spriden_last_name, 
saradap.saradap_program_1, 
spraddr.SPRADDR_STREET_LINE1, 
spraddr.spraddr_city, 
spraddr.spraddr_zip, 
spraddr.spraddr_stat_code, 
null as STAVAPDC_DESC, 
saradap.SARADAP_APPL_DATE, 
'Null' AS remove_reason, 
'Individual'   AS Account_Name, 
saradap.SARADAP_CAMP_CODE, 
CONCAT(sprtele_phone_area, 
sprtele_phone_number) "Phone", 
sprtele_tele_code, 
sorcont_ctyp_code, 
sorcont_contact_date, 
sorcont.sorcont_activity_date 
FROM saradap 
left join spriden on saradap.saradap_pidm   = spriden_pidm 
left join spraddr on saradap.saradap_pidm  = spraddr.spraddr_pidm 
left join tel on saradap.saradap_pidm = tel.sprtele_pidm 
left join sprtele ON saradap.saradap_pidm=sprtele.sprtele_pidm and sprtele.sprtele_pidm = tel.sprtele_pidm and sprtele.sprtele_seqno=tel.mx and sprtele.sprtele_tele_code = 'CU' 
left join sorcont ON saradap.saradap_pidm = sorcont.sorcont_pidm 
WHERE 
spriden.spriden_change_ind  IS NULL 
AND (saradap.SARADAP_CAMP_CODE  = 'D' or saradap.SARADAP_CAMP_CODE  = 'JD') 
AND saradap.saradap_appl_date > SYSDATE - 7 
AND spraddr.spraddr_seqno  = 
(SELECT MAX(spraddr.spraddr_seqno) 
FROM spraddr 
WHERE saradap.SARADAP_PIDM = spraddr.spraddr_pidm 
AND spraddr.spraddr_atyp_code = 'CU' 
) 
AND spraddr.spraddr_atyp_code = 'CU' 
1

Я бы переместил логику в подзапросы в предложении from. Используйте аналитические функции, чтобы получить номер телефона и адрес, который вы хотите, распределяя с подзапроса все вместе:

SELECT . . . 
FROM saradap 
     LEFT JOIN spriden 
     ON saradap.saradap_pidm = spriden_pidm 
     LEFT JOIN (select s.*, row_number() over (partition by spraddr_pidm order by spraddr_seqno desc) as seqnum 
        from spraddr 
       ) spraddr 
     ON saradap.saradap_pidm = spraddr.spraddr_pidm and seqnum = 1 
     LEFT JOIN (select s.*, row_number() over (partition by sprtele_pidm order by sprtele_seqno desc) as seqnum 
        from sprtele 
       ) sprtele 
     ON saradap.saradap_pidm = sprtele.sprtele_pidm and seqnum = 1 
     LEFT JOIN sorcont 
     ON saradap.saradap_pidm = sorcont.sorcont_pidm 
WHERE spriden.spriden_change_ind IS NULL 
     AND (saradap.SARADAP_CAMP_CODE = 'D' 
       OR saradap.SARADAP_CAMP_CODE = 'JD' 
      ) 
     AND saradap.saradap_appl_date > SYSDATE - 15 
0

Проверка подзапрос для NULL и возвращает очень большое число или 0

увидеть подобный ответ заказа : SQL Server ORDER BY date and nulls last

(CASE (SELECT MAX(spraddr.spraddr_seqno) 
            FROM  spraddr 
            WHERE  saradap.SARADAP_PIDM = spraddr.spraddr_pidm) 
    IS NULL 
    THEN 1 
    ELSE 0 
    END 

)

Смежные вопросы