0

我有一种情况,我需要从地址历史记录表中选择特定日期和时间的当前地址。一些示例记录可能如下:

地址/客户端 JOIN 表 (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 在 2013 年 5 月 17 日的修改日期之后的情况。例如,@dateOfService = '2013-08-01 12:30'。

提前致谢。

4

1 回答 1

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)
于 2013-08-16T22:43:50.877 回答