2013-06-25 27 views
1

我試圖用一個相關子查詢,但我試圖把它限制在「最佳」的紀錄。當我使用SQL非常類似於後面的內容時,每個BigTable.identifier獲得兩行,我希望只有一行。在'聯合國'聲明中,下半場比上半場更令人滿意。但是,有時需要上半場。有任何想法嗎?下面的代碼:限制相關子查詢只是一個記錄

select 
    BigTable.identifier, 
    Correlated.ID, 
    Correlated.Effective_Date, 
    Correlated.Period_Number 

from 
    BigTable 

inner join 

( 
select 
    TOP 2147483647 
    Table3.identifier, 
    Table4.Effective_Date, 
    Table4.Period_Number 

from 
    Table3 
inner join Table4 on Table3.matching_key = Table4.matching_key 
where 
    Table4.Period_Number = 0 
order by Table4.Effective_Date desc 

UNION 

select 
    TOP 2147483647 
    Table3.Identifer, 
    Table4.Effective_Date, 
    Table4.Period_Number 
from 
    Table3 
inner join Table5 on Table3.matching-key = Table5.matching-key 
inner join Table4 on Table5.key1 = Table4.key1 and 
    Table5.key2 = Table4.key2 
where 
    Table4.period_number = 1 
order by Table4.Effective_Date desc 
) as Correlated 

on BigTable.identifier = Correlated.identifier 
+0

你不說你如何決定哪個更好。也許內部查詢本身可以過濾掉存在EXISTS記錄的記錄,這些記錄可以用於UNION的其他部分。也許是某種類型的排名或得分,可以分配給UNION的每一行,讓高一個「贏」。取決於你將如何確定哪個人留下的細節。 –

+0

我想從工會聲明中的最高記錄和基於period_number desc的排名(即,在上半部分的下半部分優先選擇1)和最近生效日期中選擇「最佳」 。但是,我無法弄清楚在哪裏放置「top 1」聲明,仍然可以從BigTable獲取所有記錄。 –

回答

0

如果該聯盟各子查詢有哪些排除該行如果它是不太偏愛某些情況下,你絕不會看到在工會首選更少的行。 因此,如果每個人都有一個NOT EXISTS(......在聯合的另一側有一個更好的行......),那麼您可以在根上刪除不太偏好的行。

我不是你想如何使用生效日期清晰。假設你的意思是你更喜歡Period = 1,但如果生效日期更少,你更喜歡Period = 0,那麼類似的東西可能會起作用。

select 
    BigTable.identifier, 
    Correlated.ID, 
    Correlated.Effective_Date, 
    Correlated.Period_Number 

from 
    BigTable 

inner join 

( 
select 
    TOP 2147483647 
    Table3.identifier, 
    Table4.Effective_Date, 
    Table4.Period_Number 

from 
    Table3 
inner join Table4 on Table3.matching_key = Table4.matching_key 
where 
    Table4.Period_Number = 0 
AND NOT EXISTS 
    (select 1 
    from Table5 T5 inner join Table4 T4 
    on T5.key1 = T4.key1 and T5.key2 = T4.key2 
    where Table3.matching-key = T5.matching-key 
     and (T4.Effective_Date >= Table4.Effective_Date and T4.Period_Number = 1) 
    ) 
order by Table4.Effective_Date desc 

UNION 

select 
    TOP 2147483647 
    Table3.Identifer, 
    Table4.Effective_Date, 
    Table4.Period_Number 
from 
    Table3 
inner join Table5 on Table3.matching-key = Table5.matching-key 
inner join Table4 on Table5.key1 = Table4.key1 and 
    Table5.key2 = Table4.key2 
where 
    Table4.period_number = 1 
AND NOT EXISTS 
    (select 1 
    from Table4 T4 
    where Table3.matching-key = T4.matching-key 
     and (T4.Period_Number > 0) 
     and (T4.Effective_Date > Table4.Effective_Date and T4.Period_Number = 0) 
    ) 
order by Table4.Effective_Date desc 
) as Correlated 

on BigTable.identifier = Correlated.identifier 
+0

Darius X,謝謝! 「不存在」條款正是我所需要的。 :) –