2010-07-19 154 views
1

我目前正在開發一個轉換腳本,用於將一堆舊數據從SQL Server 2000數據庫轉移到SQL Server 2008上。我在這個轉換過程中試圖完成的事情是消除所有的組合鍵,並用一個「正確的」主鍵替換它們。顯然,當我傳輸數據時,我需要將外鍵值注入到新的表結構中。SQL - 在另一個表中獲取最大生效日期小於日期

我目前被困在一個數據集,但我似乎無法讓我的頭以集合爲基礎的方式。我工作的兩張桌子叫做「收費和法律」。他們有3對1:1關係和「鏈接」。前兩個是LawSource和LawStatue專欄的平等鏈接,但第三個專欄給我帶來了問題。 ChargeDate欄應鏈接到LawDate專欄,其中LawDate < = ChargeDate。

我當前的查詢返回給定費用的多行(在某些情況下),因爲法律可能有多於一個LawDate小於或等於ChargeDate。

這是我目前有:

select LawId 
from Law a 
join Charge b on b.LawSource = a.LawSource 
       and b.LawStatute = a.LawStatute 
       and b.ChargeDate >= a.LawDate 

無論如何,我也可以重寫此獲得在規則表中的最新條目是相同的(或更早)在ChargeDate日期?

回答

2

在SQL 2008中,使用分區功能會更容易(因此,未來應該會更容易)。

「我沒有你的模式,所以這沒有測試」通常的警告適用,但我認爲它應該做你需要的。

select 
    l.LawID 
from 
    law l 
    join (
    select 
     a.LawSource, 
     a.LawStatue, 
     max(a.LawDate) LawDate 
    from 
     Law a 
     join Charge b on b.LawSource = a.LawSource 
        and b.LawStatute = a.LawStatute 
        and b.ChargeDate >= a.LawDate 
    group by 
     a.LawSource, a.LawStatue 
) d on l.LawSource = d.LawSource and l.LawStatue = d.LawStatue and l.LawDate = d.LawDate 
1

如果性能是不是一個問題,cross apply提供了一個非常可讀的方式:

select * 
from Law l 
cross apply 
     (
     select top 1 * 
     from Charge 
     where LawSource = l.LawSource 
       and LawStatute = l.LawStatute 
       and ChargeDate >= l.LawDate 
     order by 
       ChargeDate 
     ) c 

對於每一行,此查找與最小ChargeDate另外計費表中的行。

若要包括來自Law而沒有匹配的行Charge,請將cross apply更改爲outer apply

+0

我收到語法錯誤,當我嘗試這...跨應用和外部申請有效的SQL Server 2K? – 2010-07-19 21:21:06

+0

交叉申請從2005年開始。考慮在變換數據之前移動數據:) – Andomar 2010-07-19 21:28:26

相關問題