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

这将从 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 回答
0

你不需要改变任何东西。如果子查询没有返回任何行,那么主查询将没有结果,但由于它是一个没有任何结果的计数查询,group by或者having clauses它总是会返回正好有一个值的一行,这可能是0.

它永远不会返回 null,也不会给你一个 NO_DATA_FOUND 异常。NO_DATA_FOUND 异常不是 SQL,而是当您尝试为变量赋值时发生的 PL/SQL 错误selectinto但(主)选择不返回任何行。

于 2013-11-07T15:47:22.393 回答