Sql server 如何检查SQL Server中的计数是否为1?

Sql server 如何检查SQL Server中的计数是否为1?,sql-server,count,Sql Server,Count,我有一个带有where条件的Select查询,在该条件下,我必须检查是否只得到一条记录。我尝试了下面显示的查询,但没有成功 SELECT * FROM wsm_Certification_WorkersCompensation WHERE (SELECT COUNT(*) FROM (SELECT TOP 1 WCS.ExpiryDate FROM wsm_Certification_WorkersCompensation AS WCS

我有一个带有
where
条件的
Select
查询,在该条件下,我必须检查是否只得到一条记录。我尝试了下面显示的查询,但没有成功

SELECT *
FROM wsm_Certification_WorkersCompensation
WHERE
    (SELECT COUNT(*)
     FROM
         (SELECT TOP 1 WCS.ExpiryDate
          FROM wsm_Certification_WorkersCompensation AS WCS
          INNER JOIN [dbo].[wsm_Ref_State] AS ST ON WCS.StateID = ST.StateID
          WHERE WCS.CertificationID = 22653
            AND ExpiryDate >= GETDATE()
          ORDER BY ExpiryDate DESC) AS A = 1);

您的查询有语法错误。您还可以忽略内部查询中的ORDERBY子句

SELECT *
FROM wsm_Certification_WorkersCompensation
WHERE(
SELECT COUNT(*)
FROM
(
    SELECT TOP 1 WCS.ExpiryDate
    FROM wsm_Certification_WorkersCompensation AS WCS
         INNER JOIN [dbo].[wsm_Ref_State] AS ST ON WCS.StateID = ST.StateID
    WHERE WCS.CertificationID = 22653
          AND ExpiryDate >= GETDATE()
    ORDER BY ExpiryDate DESC
) AS A) = 1

由于您选择的是
TOP 1
,然后检查计数是否为1,因此我非常确定您可以将逻辑替换为:


如果我理解你的要求是正确的。这可能就是您想要的查询:

SELECT *
FROM wsm_Certification_WorkersCompensation
WHERE EXISTS (   SELECT TOP 1 1
                 FROM wsm_Certification_WorkersCompensation AS WCS
                 INNER JOIN dbo.wsm_Ref_State AS ST
                     ON WCS.StateID = ST.StateID
                 WHERE WCS.CertificationID = 22653
                 AND ExpiryDate >= GETDATE()
                 HAVING COUNT(*) = 1);

让COUNT(*)=1
将检查内部查询中的匹配计数是否为1,如果不是,则不会返回任何内容。

您的预期输出不是很清楚。如果结果为1,则需要什么样的输出?where子句中的select语句计数基本上应等于1,如果内部查询等于1,则需要返回整个表?是@EvaldasBuinauskasIsn不总是计数为1,因为您选择的是
TOP(1)
?是。要求是检查记录是否存在。我需要Order by,因为我想获得最大的日期。如果此查询不适用于您,请编辑您的问题以澄清您的要求。@AkhilJain如果您没有选择记录,只是检查它是否存在,如果它是最近的日期,为什么重要,或者最早的日期?这不检查它是否存在吗?不是只有一排吗?它可能在那里times@dbajtr是的,但问题中的查询在计数之前使用
TOP 1
,因此计数将返回1,即使整个集合中有多条匹配记录。我所做的只是简化逻辑,删除排序和计数,只使用exists,这应该会更好地优化。我没有看到这一点。我同意这将是最有效的
SELECT *
FROM wsm_Certification_WorkersCompensation
WHERE EXISTS (   SELECT TOP 1 1
                 FROM wsm_Certification_WorkersCompensation AS WCS
                 INNER JOIN dbo.wsm_Ref_State AS ST
                     ON WCS.StateID = ST.StateID
                 WHERE WCS.CertificationID = 22653
                 AND ExpiryDate >= GETDATE()
                 HAVING COUNT(*) = 1);