2013-08-16 62 views
0

我有一種情況,需要從地址歷史記錄表中選擇當前特定日期和時間的地址。一些樣本記錄可能如下:在日期範圍之外選擇歷史記錄

地址/客戶端連接表(Address_Client_JOIN):

------------------------- 
|AddressId | ClientId | 
------------------------- 
|5   | 8888887 | 
------------------------- 
|6   | 8888887 | 
------------------------- 

歷史記錄表(Address_History):

------------------------------------------------------------------------------------------- 
|HistoryId | AddressId | AddTypeId | StreetAddress | CreatedDate  | ModifiedDate | 
------------------------------------------------------------------------------------------- 
|1   |  5  |  1  | 123 Home Street| 2013-03-11 21:08 | 2013-04-02 13:18| 
------------------------------------------------------------------------------------------- 
|2   |  5  |  2  | 456 My Avenue | 2013-03-11 21:08 | 2013-04-08 15:00| 
------------------------------------------------------------------------------------------- 
|3   |  6  |  1  | 789 Cat Road | 2013-05-17 12:00 | 2013-05-17 12:00| 
------------------------------------------------------------------------------------------- 

此查詢的要求是,我有獲取@dateOfService落在CreatedDate和ModifiedDate之間以及AddTypeId爲「1」的最早記錄(如果有的話),否則就是任何其他AddTypeId。我迄今創建的查詢是:

SELECT TOP 1 ah.HistoryId, ah.AddTypeId, ah.AddressId, ah.StreetAddress, 
ah.CreatedDate, ah.ModifiedDate 
FROM Address_Client_JOIN acj WITH (NOLOCK) 
INNER JOIN Address_History ah WITH (NOLOCK) ON ah.AddressId = acj.AddressId 
WHERE apj.ClientId = @clientId 
    AND (ah.CreatedDate <= @dateOfService 
     AND (@dateOfService <= ah.ModifiedDate)) 
ORDER BY 
    ah.HistoryId ASC, CASE WHEN ah.AddTypeId = 1 THEN 0 ELSE 1 END 

這隻要@dateOfService落在CreatedDate和ModifiedDate之間正常工作。但是,當我在ModifiedDate後面發現@dateOfService時,顯然我什麼也得不到。我需要能夠解釋(使用上述數據)@dateOfService在5/17/2013的ModifiedDate之後的情況。例如,@dateOfService ='2013-08-01 12:30'。

在此先感謝。

回答

0

您只選擇第一行。這意味着您可以將where篩選器移動到order by子句中。然後,它成爲一個優先事項而不是過濾器。

因此,如果沒有匹配的過濾器,你仍然可以得到一排。我想你想要的查詢是這樣的:

SELECT TOP 1 ah.HistoryId, ah.AddTypeId, ah.AddressId, ah.StreetAddress, 
     ah.CreatedDate, ah.ModifiedDate 
FROM Address_Client_JOIN acj WITH (NOLOCK) INNER JOIN 
    Address_History ah WITH (NOLOCK) 
    ON ah.AddressId = acj.AddressId 
WHERE apj.ClientId = @clientId 
ORDER BY ah.HistoryId ASC, 
     (CASE WHEN ah.AddTypeId = 1 THEN 0 ELSE 1 END), 
     (case when ah.CreatedDate <= @dateOfService AND @dateOfService <= ah.ModifiedDate then 1 
       when @dateOfService > ah.ModifiedDate then 2 
       else 3 
      end)