2016-03-31 44 views
0

我被困在構建邏輯的點上。誰能幫我 ?邏輯在結果集中只得到一行

要求:

對於privacyType = '主地址',如果有> 1行,其中SI0_ADDR.ADDR_TYPE_CODE = 'M',顯示行,其中的currentdate()是SI0_ADDR.ADDR_EFF_DATE和SI0_ADDR.ADDR_EXPR_DATE之間。

我的查詢是:

select STU_ID 
     ,case when Privacyflag = '' then 'N' 
      else Privacyflag 
     end Privacyflag 
     ,type from (
select a.STU_ID,Privacyflag,a.type 
    ,ROW_NUMBER() OVER (ORDER BY ADDR_EXPR_DATE DESC) disp_nm from (
select ad.STU_ID, case when ad.ADDR_TYPE_CODE = 'M' then ad.ADDR_PRIVACY_FLAG 
         when ad.ADDR_TYPE_CODE='' then 'N' 
        end Privacyflag, 'Primary Phone' type 
       , case when ADDR_EXPR_DATE = '1900-01-01' then '2100-12-31' 
         else ADDR_EXPR_DATE 
       end as ADDR_EXPR_DATE 

from SI0_ADDR ad 
where ad.STU_ID = @studentid) a 
where Privacyflag is not null 
) ab 
where ab.disp_nm = '1' 

這個邏輯並不在某些情況下

+2

請按照幫助文檔中的發佈準則。 [最小,完整,可驗證的示例](http://stackoverflow.com/help/mcve)適用於此處。 「在某些情況下不工作」不是問題描述。 – Prune

+0

查詢中的「主要地址」在哪裏?我沒有看到你使用它的地方 – FLICKER

回答

0

你不以任何方式的日期,這是你的要求的一部分工作資格。你的查詢不需要這麼多嵌套的子查詢。 PrivacyFlag似乎不是你的問題的一部分,所以我沒有將它用於這個例子。你的例子顯示Primary Phone,但你的問題談到Primary Address,所以我不知道如何解決這個問題。

無論如何,這裏是一個非常簡單的例子,它顯示了數據,以及如何將一個記錄與最近的過期日期以及最近的生效日期(如果有兩個記錄相同截止日期)。

create table #temp (stu_id int, type varchar(10), address varchar(50), eff_date datetime, expr_date datetime) 

insert into #temp values 
(1, 'primary', '123 NW 52nd', '1/1/2016', '1/1/1900'), 
(1, 'primary', '942 SE 33rd', '1/2/2016', '12/31/2016'), 
(1, 'primary', '721 SW 22nd', '4/1/2015', '1/1/1900') 

select top 1 * 
from (
     select stu_id 
       ,type 
       ,address 
       ,eff_date 
       ,case when expr_date = '1/1/1900' then '12/31/2100' else expr_date end as expr_date 
     from #temp 
     where stu_id = 1 
      and type = 'primary' 
     ) as a 
where getdate() between eff_date and expr_date 
order by a.expr_date desc, a.eff_date desc 

drop table #temp 

你甚至可以用零子查詢做到這一點,但隨後你需要複製case語句轉換成whereorder by零件查詢:

select top 1 
     stu_id 
     ,type 
     ,address 
     ,eff_date 
     ,case when expr_date = '1/1/1900' then '12/31/2100' else expr_date end as expr_date 
from #temp 
where stu_id = 1 
    and type = 'primary' 
    and getdate() between eff_date and case when expr_date = '1/1/1900' then '12/31/2100' else expr_date end 
order by case when expr_date = '1/1/1900' then '12/31/2100' else expr_date end desc 
     ,eff_date desc 

這麼小數據集,showplan沒有指出哪個查詢是最有效的;它爲兩個查詢顯示了相同的查詢計劃,第一個select語句花費了7個CPU週期來編譯計劃,第二個select語句花費了2個CPU週期來編譯計劃。您可能想要針對帶有索引等的實際表格上的較大數據集進行測試,並查看哪個表現最佳。