1

我有一个查询可以提取有关用户的信息。用户可能没有、一个或多个电话号码。我要做的是让用户最新的电话号码(由 seq 号码确定)加入到带有其他基本人口统计数据的查询中。我面临的问题是,如果我的子查询返回 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
                            )
4

3 回答 3

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
于 2013-04-15T19:24:39.917 回答
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'
于 2013-04-17T16:58:47.133 回答
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

)

于 2013-04-15T19:32:47.490 回答