NULL-rijen in TSQL-query elimineren

Mogelijk duplicaat:
   NULL-velden in TSQL verwijderen

I am using SSMS 2008 R2 and am developing a TSQL query. I want just 1 record/profile_name. Because some of these values are NULL, I am currently doing LEFT JOINS on most of the tables. But the problem with the LEFT JOINs is that now I get > 1 record for some profile_names!

Maar als ik dit in INNER JOINs wijzig, worden sommige profielnamen volledig uitgesloten omdat ze NULL-waarden hebben voor deze kolommen. Hoe beperk ik het queryresultaat tot slechts één record/profielnaam, ongeacht NULL-waarden? En als er niet-NULL-waarden zijn, wil ik dat deze de record met niet-NULL-waarden kiest. Hier is de eerste vraag:

select distinct
        gp.group_profile_id,
        gp.profile_name,
        gp.license_number,
        gp.is_accepting,
        case when gp.is_accepting = 1 then 'Yes'
            when gp.is_accepting = 0 then 'No '
            end as is_accepting_placement,
        mo.profile_name as managing_office,
        regions.[region_description] as region,     
        pv.vendor_name,
        pv.id as vendor_id,
        at.description as applicant_type,
        dbo.GetGroupAddress(gp.group_profile_id, null, 0) as [Office Address],
        gsv.status_description
from  group_profile gp With (NoLock)
    inner join group_profile_type gpt With (NoLock) on gp.group_profile_type_id = gpt.group_profile_type_id and gpt.type_code = 'FOSTERHOME' and gp.agency_id = @agency_id and gp.is_deleted = 0
    inner join group_profile mo With (NoLock) on gp.managing_office_id = mo.group_profile_id
    left outer join payor_vendor pv With (NoLock) on gp.payor_vendor_id = pv.payor_vendor_id
    left outer join applicant_type at With (NoLock) on gp.applicant_type_id = at.applicant_type_id and at.is_foster_home = 1
    inner join group_status_view gsv With (NoLock) on gp.group_profile_id = gsv.group_profile_id and gsv.status_value = 'OPEN' and gsv.effective_date =  
    (Select max(b.effective_date) from  group_status_view b  With (NoLock)
    where gp.group_profile_id = b.group_profile_id)
    left outer join regions With (NoLock) on isnull(mo.regions_id, gp.regions_id) = regions.regions_id
    left join enrollment en on en.group_profile_id = gp.group_profile_id
    join event_log el on el.event_log_id = en.event_log_id
    left join people client on client.people_id = el.people_id

Zoals u ziet, zijn de resultaten van de bovenstaande zoekopdracht 1 rij/profielnaam:

group_profile_id    profile_name    license_number  is_accepting    is_accepting_placement  managing_office region  vendor_name vendor_id   applicant_type  Office Address  status_description  Cert Date2

Maar kijk nu wat er gebeurt als ik 2 LINKSE JOINs en 1 extra kolom toevoeg:

select distinct
        gp.group_profile_id,
        gp.profile_name,
        gp.license_number,
        gp.is_accepting,
        case when gp.is_accepting = 1 then 'Yes'
             when gp.is_accepting = 0 then 'No '
            end as is_accepting_placement,
        mo.profile_name as managing_office,
        regions.[region_description] as region,     
        pv.vendor_name,
        pv.id as vendor_id,
        at.description as applicant_type,
        dbo.GetGroupAddress(gp.group_profile_id, null, 0) as [Office Address],
        gsv.status_description,
            ri.[description] as race
from  group_profile gp With (NoLock)
    inner join group_profile_type gpt With (NoLock) on gp.group_profile_type_id = gpt.group_profile_type_id and gpt.type_code = 'FOSTERHOME' and gp.agency_id = @agency_id and gp.is_deleted = 0
    inner join group_profile mo With (NoLock) on gp.managing_office_id = mo.group_profile_id
    left outer join payor_vendor pv With (NoLock) on gp.payor_vendor_id = pv.payor_vendor_id
    left outer join applicant_type at With (NoLock) on gp.applicant_type_id = at.applicant_type_id and at.is_foster_home = 1
    inner join group_status_view gsv With (NoLock) on gp.group_profile_id = gsv.group_profile_id and gsv.status_value = 'OPEN' and gsv.effective_date =  
    (Select max(b.effective_date) from  group_status_view b  With (NoLock)
    where gp.group_profile_id = b.group_profile_id)
    left outer join regions With (NoLock) on isnull(mo.regions_id, gp.regions_id) = regions.regions_id
    left join enrollment en on en.group_profile_id = gp.group_profile_id
    join event_log el on el.event_log_id = en.event_log_id
    left join people client on client.people_id = el.people_id
    left join race With (NoLock) on el.people_id = race.people_id
    left join race_info ri with (nolock) on ri.race_info_id = race.race_info_id

De bovenstaande query resulteert in alle dezelfde profile_names, maar sommige met NULL race-waarden:

group_profile_id    profile_name    license_number  is_accepting    is_accepting_placement  managing_office region  vendor_name vendor_id   applicant_type  Office Address  status_description  Cert Date2  race

Helaas compliceert het zaken die ik nodig heb om deel te nemen in 2 extra tabellen voor deze ene extra veldwaarde (race). Als ik simpelweg de laatste twee links naar links in INNER JOINs verander, elimineer ik de NULL-rijen hierboven. Maar ik verwijder ook enkele van de profielnamen:

group_profile_id    profile_name    license_number  is_accepting    is_accepting_placement  managing_office region  vendor_name vendor_id   applicant_type  Office Address  status_description  Cert Date2  race

Hopelijk heb ik alle details gegeven die je nodig hebt voor deze vraag.

0
Ik heb net de opmaak gerepareerd.
toegevoegd de auteur salvationishere, de bron
Goed gedaan, Alex. Ik heb het net verwijderd.
toegevoegd de auteur salvationishere, de bron
dit lijkt te veel om leesbaar te zijn. tabellen gegevens zijn ook niet goed opgemaakt
toegevoegd de auteur codingbiz, de bron
er kunnen meerdere rijen voorkomen als er meer dan één record in de tabel JOINed to is. Verwijder de een na de ander van de laatste twee joins en kijk welke er wordt verdubbeld. er kunnen meer dan één race.people_id zijn die overeenkomt met of raceinfo.race_info_id
toegevoegd de auteur codingbiz, de bron
Gast, ik hoop dat het testgegevens zijn. Ik wil gewoon niet dat je in de problemen komt over de echte telefoons/namen.
toegevoegd de auteur Alex Pakka, de bron

1 antwoord

Niet de meest elegante oplossing, maar wel een die werkt:

select [stuff]
from  group_profile gp With (NoLock) 
  inner join group_profile_type gpt With (NoLock) on gp.group_profile_type_id = gpt.group_profile_type_id and gpt.type_code = 'FOSTERHOME' and gp.agency_id = @agency_id and gp.is_deleted = 0 
  inner join group_profile mo With (NoLock) on gp.managing_office_id = mo.group_profile_id 
  join payor_vendor pv on ISNULL(gp.payor_vendor_id, 'THISVALUEWILLNEVEROCCUR') = ISNULL(pv.payor_vendor_id, 'THISVALUEWILLNEVEROCCUR')
...etc...

Het grootste probleem met wat ik heb gepost is dat je heel veel tafelscans zult doen.

1
toegevoegd
De oorzaak van de overtollige records was mijn 'volkstabel'. Bedankt.
toegevoegd de auteur salvationishere, de bron