2010-02-23 51 views
0

这是我的关系模型:SQL:最新纪录

Request 
    ------------------------------ 
    RequestId 
    ------------------------------ 
    1 
    2 


    RequestState 
    ------------------------------ 
    RequestStateId | Name 
    ------------------------------ 
    10    | Received 
    20    | Processing 
    30    | Finsihed 


    Request_RequestState 
    ------------------------------------------------------------------- 
    Request_RequestStateId | RequestId | RequestStateId | CreatedOn 
    ------------------------------------------------------------------- 
    1      | 1   | 10    | 2010-01-01 
    2      | 1   | 20    | 2010-01-02 
    3      | 2   | 10    | 2010-01-15 

每次请求的状态变化,这种变化被存储。 现在我需要按照当前状态列出请求。 像“获取当前状态的所有请求=接收”。

到目前为止,我只设法创建一个返回给定状态的请求的查询,但不管它是当前状态还是旧的状态......所以我不知何故需要使用CreatedOn来获取最新/当前状态。

任何帮助?提前致谢!

回答

2

你改变你的模型...

在当前的计划,随着越来越多的数据变化发生,这将需要更长的时间和更长的使用上面建议的查询来确定当前状态...

您的请求需要“Current_Request_State”属性。

0

这应该为你做它:

SELECT  r.RequestId, 
      s.Name AS RequestStateName 
FROM  Request r 
INNER JOIN Request_RequestState rs 
     ON rs.Request_RequestStateId = (
       SELECT TOP 1 x.Request_RequestStateId 
       FROM  Request_RequestState x 
       WHERE  x.RequestId = r.RequestId 
         --// you could add filter to get "current" status at some DATE 
         --//AND x.CreatedOn < '2010-01-15' 
       ORDER BY x.CreatedOn DESC 
      )      
INNER JOIN RequestState s 
     ON s.RequestStateId = rs.RequestStateId 

WHERE  s.Name = 'Received' 

您还可以得到所有“当前”要求一些其他日期的,如果使用过滤器的代码注释。

我可能只是创建从上面的SQL查询视图,并使用它:

SELECT * FROM MyRequestStateView WHERE RequestStateName = 'Received' 
0

假设Request_RequestStateId增加了时间(以最大的ID,即记录了最新的CreatedOn日期)。 ...

SELECT rrs.RequestId, rrs.RequestStateId, rs.Name 
FROM Request_RequestState rrs 
    JOIN (
     SELECT MAX(Request_RequestStateId) AS LatestRequestStateId 
     FROM Request_RequestState 
     GROUP BY RequestId 
    ) rrs2 ON rrs.Request_RequestStateId = rrs2.LatestRequestStateId 
    JOIN RequestState rs ON rrs.RequestStateId = rs.RequestStateId 
WHERE rs.Name = 'Received' 
0

一个可能的查询可能看起来像:

select r.requestId, 
rs.RequestStateId, 
rs.Name, 
rrs.CreatedOn 
from (select r2.* from request_requeststate where r2.createdon = (select max(createdon) from request_requeststate r3 where r3.request_requeststateId = r2.request_requeststateId)) rrs 
inner join requeststate rs on rs.requeststateId = rrs.reqeststateid 
inner join request r on r.requestid = rrs.requestid 

您可以使用此查询作为视图或添加where子句,在其中筛选特定请求状态。

1

这个查询也应该给你你想要的,但我也同意Martin Milan你应该考虑在请求表上缓存最新的状态值。

SELECT r.RequestId, rrs.RequestStateId, rs.RequestStateName, rrs.StateChangedDate 
FROM Request r 
    INNER JOIN (
     SELECT ROW_NUMBER() OVER (PARTITION BY RequestId ORDER BY CreatedOn DESC) AS ROWNUM, 
       RequestId, 
       RequestStateId 
       CreatedOn 
     FROM Request_RequestState  
    ) rrs 
     ON r.RequestId = rrs.RequestId 
     AND ROWNUM = 1 
    INNER JOIN RequestState rs 
     ON rrs.RequestStateId = rs.REquestStateId