TSQL Select元素只有一个值

时间:2016-12-27 16:00:22

标签: sql sql-server tsql

我有一个项目需要保存文件请求。我必须用每个步骤的日期保存请求的状态。

我的数据库中有两个表:

FileRequest:

enter image description here

FileRequestStatus:

enter image description here

我想创建一个请求,让表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

3 个答案:

答案 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