2012-06-23 40 views
0

可能重複:
How to eliminate NULL fields in TSQL消除在TSQL查詢NULL行

我使用SSMS 2008 R2和正在開發一個TSQL查詢。我只需要1條記錄/ profile_name。由於其中一些值爲NULL,因此我目前在大多數表上執行了LEFT JOINS。但是LEFT JOINs的問題是,現在我爲一些profile_names獲得了> 1條記錄!

但是,如果我將其更改爲INNER JOIN,那麼一些profile_names將被完全排除,因爲它們具有這些列的NULL值。不管NULL值如何限制查詢結果只有一個record/profile_name?如果有非NULL值,那麼我希望它選擇非NULL值的記錄。這裏是初始查詢:

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 

正如你所看到的,上面查詢的結果爲1列/ PROFILE_NAME:

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 

但現在看,當我在2 LEFT添加會發生什麼連接和1其他列:

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 

上面的查詢結果都一樣profile_names的,但一些帶有NULL值的比賽:

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 

不幸的是,我需要爲這個額外的字段值(比賽)加入2個額外的表格。如果我只是將上面的兩個LEFT JOIN更改爲INNER JOIN,那麼我會消除上面的NULL行。但我也消除了一些profile_names:

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 

希望我已經提供了所有這個問題所需的細節。

+0

這似乎太多了,無法讀取。表格數據格式不太好 – codingbiz

+0

我只是修改了格式。 – salvationishere

+1

如果JOIN表中有多個記錄,則可能會出現多行。從最後2個連接中,一個接一個地刪除,看看哪一個導致重複。可以有多個race.people_id匹配或raceinfo.race_info_id – codingbiz

回答

1

不是最完美的解決方案,而是一個將工作:

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... 

最大的問題與我貼的是,你會做一大堆的表掃描。

+0

冗餘記錄的原因是我的「人員」表。謝謝。 – salvationishere