我正在查看的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
感谢。
答案 0 :(得分:0)
这将从SIPR.KDX KDX获取所有行以及其他令人满意的条件 在where子句中,但子查询的互斥结果。这是 在集合语言中类似的A-B-C,其中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)
答案 1 :(得分:0)
您无需更改任何内容。如果子查询没有返回任何行,那么主查询将没有结果,但由于它是一个没有任何group by
或having clauses
的计数查询,它将始终只返回一行只有一个值,这可能是是0
。
它永远不会返回null,也不会给你一个NO_DATA_FOUND异常。 NO_DATA_FOUND异常不是SQL,而是当您尝试select
一个值into
变量时发生的PL / SQL错误,但(主)选择不返回任何行。