4

私が行った場合

SELECT * FROM cte1 c
    WHERE c.GrantNumber NOT IN
    (

      SELECT t1.nai_grant_number FROM #temp t1

    ) 

これは正常に機能します。

しかし、私がそうするなら

SELECT * FROM cte1 c
    WHERE c.GrantNumber NOT IN
    (
      CASE WHEN 
                @AutoRenewalChk = 1 THEN
                 (

                     SELECT t1.nai_grant_number FROM #temp t1
                 ) END          
    )

エラーが発生する

メッセージ512、レベル16、状態1、行33サブクエリが複数の値を返しました。サブクエリが=、!=、<、<=、>、> =の後に続く場合、またはサブクエリが式として使用される場合、これは許可されません。

理由は何ですか?上記のようなcaseステートメントを使用することはできませんか?

ありがとう

4

3 に答える 3

3
SELECT * FROM cte1 AS c
WHERE NOT EXISTS
(
  SELECT 1 FROM #temp AS t1 
  WHERE t1.nai_grant_number = CASE @AutoRenewalChk 
    WHEN 1 THEN c.GrantNumber END
);

NOTINがここで機能しない理由はここにあります。これらの2つのクエリを試してください。いずれの場合も同じ結果を期待しますか?

SELECT x FROM (SELECT x = 1) AS x WHERE x NOT IN 
    (SELECT y = 2);

SELECT x FROM (SELECT x = 1) AS x WHERE x NOT IN 
    (SELECT y = 2 UNION ALL SELECT NULL);

ここに可能なNULLを追加すると(Dan Pが彼の回答でELSEとして提案した場合、または#tempにnai_grant_numberがNULLである単一の行を含めることができる場合)、NOTINのセマンティクスが完全に変更されます。したがって、NOT INクエリの作成を検討しているときはいつでも、NOT EXISTS(またはLEFT OUTER JOIN、またはその他の構造体)として再考する必要があります。

于 2012-05-04T03:30:52.083 に答える
0

他の人がCASEWhenが単一の列または行セットではなく値で機能することについて言及しているので、代わりにこれを試してください。c.GrantNumberがnullになることはないと仮定すると、これでうまくいくはずです。

SELECT * FROM cte1 c 
WHERE c.GrantNumber NOT IN 
( 
    SELECT DISTINCT
        CASE WHEN @AutoRenewalChk = 1
            THEN t1.nai_grant_number
            ELSE NULL
        END
    FROM #temp t1
)
于 2012-05-04T02:57:29.940 に答える
0

エラーが示すように、クエリは複数の行を返します。チャンネル登録者を変更した場合は、トップ1を選択してください...それは機能します

于 2012-05-04T02:44:44.697 に答える