2017-10-24 13 views
0

私はwhereという条件のSelectクエリを持っています。その条件では、レコードが1つしかないかどうかをチェックする必要があります。私はこのクエリを以下のように試してみましたが、うまくいきませんでした。SQL Serverでcountが1かどうかを確認するには?

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); 
+0

予想される出力はあまり明確ではありません。結果が1の場合とそうでない場合の出力の種類は何ですか? –

+0

基本的にselect文のwhere句の数は1に等しくなければならない –

+0

したがって、内側のクエリが1に等しい場合はテーブル全体を返すか? –

答えて

0

クエリに構文エラーがあります。あなたはその後、カウントが1にあるかどうかをチェック、TOP 1を選択しているので、あなたはまた、内側のクエリ

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 
+0

あなたは 'TOP(1)'を選択しているので、カウントは常に1になるでしょうか? –

+0

はい。レコードが存在するかどうかを確認する必要があります。 – Niraj

+0

私は最大の日付を取得したいので注文が必要です –

2

でORDER BY句を無視することができ、私はあなただけEXISTSであなたのロジックを置き換えることができますことをかなり確信している:

SELECT * 
FROM wsm_Certification_WorkersCompensation 
WHERE EXISTS 
     ( SELECT 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() 
     ); 
+0

これは存在していないかチェックしますか? 1行しかないのではないでしょうか?複数回ある可能性があります。 – dbajtr

+0

@dbajtrはい、質問内のクエリは、カウントの前に「TOP 1」を使用しているため、セット全体に一致するレコードが複数あっても、カウントは1を返します。私がやったのは、ソートとカウントを取り除くロジックを単純化することだけです。単に存在を使用するだけです。 – GarethD

+0

本当にそれは分かりませんでした。私は存在が最も功績のある者であることに同意する – dbajtr

0

私はあなたの要件が正しいことを理解しています。それはおそらくあなたが望むクエリです:何も返さないではない場合

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); 

HAVING COUNT(*) = 1は、あなたの内側のクエリでマッチのカウントが1であるかどうかをチェックします。

関連する問題