0

私が見ている PL/SQL クエリは、レコード数を決定するときにサブクエリを使用します。

SELECT COUNT(*)
INTO v_seqn
FROM SIPR.KDX KDX
WHERE KDX.KDX_STUC NOT IN ( SELECT ADD1.ADD_ADID
                            FROM SIPR.MEN_ADD ADD1
                            WHERE ADD1.ADD_ADID = KDX.KDX_STUC)
AND KDX.KDX_STUC = v_stud_id
AND KDX.KDX_SITS = 'A';

サブクエリがレコードを返さない場合、処理可能な NO_DATA_FOUND 例外が発生しますか、それとも完全に有効であり、メイン クエリの "NOT IN" 句に対して単に null を返し、カウントが 0 になります。

ありがとう。

4

2 に答える 2

0

何も変更する必要はありません。サブクエリが行を返さない場合、メイン クエリには結果がgroup byありhaving clausesません0

null を返すことはなく、NO_DATA_FOUND 例外も発生しません。selectNO_DATA_FOUND 例外は SQL ではなく、変数に値を入力しようとしたときに発生する PL/SQL エラーですintoが、(メイン) 選択で行が返されません。

于 2013-11-07T15:47:22.393 に答える
0

これにより、SIPR.KDX KDX からすべての行がフェッチされ、where 句の他の条件を満たすが、サブクエリの相互に排他的な結果が得られます。これはセット言語の ABC に似ています。ここで、A はテーブル、B はサブクエリ、C は where 句の他のすべての条件を満たす条件です。

外部結合を使用してみてください

SELECT
      COUNT ( * )
INTO
      V_SEQN
FROM
          (SELECT
                *
           FROM
                SIPR.KDX KDX
           WHERE
                KDX.KDX_STUC = V_STUD_ID
                AND KDX.KDX_SITS = 'A') TABLE1
      LEFT OUTER JOIN
          SIPR.MEN_ADD ADD1
      ON TABLE1.KDX_STUC = ADD1.ADD_ADID
WHERE
      ADD1.ADD_ADID IS NULL;

または存在しないを使用

SELECT
      COUNT ( * )
INTO
      V_SEQN
FROM
          (SELECT
                *
           FROM
                SIPR.KDX KDX
           WHERE
                KDX.KDX_STUC = V_STUD_ID
                AND KDX.KDX_SITS = 'A') TABLE1
  WHERE NOT EXISTS  
        (SELECT   
               1  
          FROM  
               SIPR.MEN_ADD ADD1  
          WHERE  
               TABLE1.KDX_STUC = ADD1.ADD_ADID)      
于 2013-11-07T15:40:23.670 に答える