这是我的关系模型:
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获取最新状态/当前状态。
有任何帮助吗?提前谢谢!
答案 0 :(得分:2)
你改变你的模型......
使用当前方案,随着越来越多的数据发生变化,使用上面建议的查询确定当前状态需要更长时间和更长时间...
您的请求需要“Current_Request_State”属性。
答案 1 :(得分:1)
此查询还应该为您提供所需的内容,但我同意Martin Milan的观点,您应该考虑在Request表上缓存最新的状态值。
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
答案 2 :(得分: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'
答案 3 :(得分: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'
答案 4 :(得分: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子句来过滤特定的请求状态。