PL/SQL中的子查询未返回任何数据
我正在查看的PL/SQL查询在确定记录计数时使用子查询:PL/SQL中的子查询未返回任何数据,sql,exception,plsql,subquery,Sql,Exception,Plsql,Subquery,我正在查看的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
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
谢谢。这将在满足其他条件的情况下从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)
你不需要改变任何事情。如果子查询不返回任何行,那么主查询将不会有结果,但由于它是一个计数查询,没有任何
group by
或具有子句
,因此它将始终只返回一行和一个值,可能是0
它永远不会返回null,也不会给您一个“未找到数据”的异常。“找不到数据”异常不是SQL,而是PL/SQL错误,当您尝试将值
选择到变量中,但(主)选择没有返回任何行时,会发生该错误。您尝试过运行它吗?在这种情况下,不会抛出NO\u DATA\u FOUND
异常,并且COUNT
将返回0
。不幸的是,我自己没有访问环境的权限来测试它,我正在尝试帮助同事。遗憾的是,这里没有PLSQL专家,所以我呼吁so上的专家们::-)我知道,在这种情况下,正如我所说的,不会抛出NO\u DATA\u FOUND
异常。如果您选择的是,<将>编码到
一些变量中,并且该查询将不会产生任何结果,然后您将得到未找到任何数据
。在查询中,当子查询不返回任何行时,COUNT(*)
将返回0
。