我有一个项目需要保存文件请求。我必须用每个步骤的日期保存请求的状态。
我的数据库中有两个表:
FileRequest:
FileRequestStatus:
我想创建一个请求,让表FileRequest
中的每个FileName只有Status == 'NEW'
。在这种情况下,所需的输出为C12345, LIVE
。
如果您有更好的想法来构建我的数据库,我会接受它
我尝试过类似的东西:
SELECT [FileName] FROM [FileRequest]
INNER JOIN [FileRequestStatus] ON [FileRequestStatus].[RequestId] = [FileRequest].[RequestId]
GROUP BY [FileRequestStatus].[RequestId]
HAVING COUNT([FileRequestStatus].[RequestStatus]) < 2
答案 0 :(得分:1)
SELECT FR.FileName
FROM [FileRequest] FR
INNER JOIN [FileRequestStatus] FRS ON FRS.[RequestId] = FR.[RequestId]
GROUP BY FR.FileName
HAVING COUNT(CASE WHEN FRS.RequestStatus <> 'New' THEN 1 END) = 0 --No statuses other than `NEW`
AND COUNT(CASE WHEN FRS.RequestStatus = 'New' THEN 1 END) >= 1 --Atleast one status `NEW`
答案 1 :(得分:1)
我认为最简单的方法是聚合:
select fr.FileName
from nep.FileRequest fr join
nep.FileRequestStatus] frs
on frs.RequestId = fr.RequestId
group by fr.FileName
having min(frs.RequestStatus) = max(frs.RequestStatus) and
min(frs.RequestStatus) = 'New';
注意:这假设请求状态永远不会NULL
(虽然这很容易考虑)。
这样做是按文件名聚合,然后检查给定文件的状态是否相等(第一个条件)并等于'New'
(第二个条件)。
答案 2 :(得分:0)
您需要在[FileName]
中加入GROUP BY
,然后才能在结果中选择
SELECT [nep].[FileRequest].[FileName] FROM [nep].[FileRequest]
INNER JOIN [nep].[FileRequestStatus] ON [nep].[FileRequestStatus].[RequestId] = [nep].[FileRequest].[RequestId]
GROUP BY [nep].[FileRequestStatus].[RequestId], [nep].[FileRequest].[FileName]
HAVING COUNT([nep].[FileRequestStatus].[RequestStatus]) < 2