无效的子查询但外部查询返回记录

时间:2016-05-16 09:44:21

标签: sql oracle11g subquery

我有两张桌子EMP& DEPT。以下是说明。

**EMP table:**

EMP_ID        NUMBER      
EMP_NAME      VARCHAR2(4)

**DEPT table:**

DEPT_ID        NUMBER      
DEPT_NAME      VARCHAR2(4)

当我运行以下查询时,即使子查询无效,它也会成功执行。

SELECT * FROM EMP WHERE EMP_ID IN (SELECT SAL FROM DEPT);

我期待 ORA-00904:无效标识符,但它会从EMP表中返回记录。

2 个答案:

答案 0 :(得分:0)

当子查询的结果不为null时,会发生这种情况。

在你的情况下,奇怪的是,似乎报告了该列不存在的错误,返回的结果是非空的,然后选择顶部仍然完成

答案 1 :(得分:0)

这是因为Oracle支持一级深度的相关子查询。因此,外部查询中列的范围包括示例中的子查询。

您编写的查询等同于:

SELECT *
FROM   EMP
WHERE  EMP_ID IN (SELECT EMP.SAL
                  FROM   DEPT);

它还强调了为查询提供充分别名的必要性 - 如果您已经写过:

SELECT *
FROM   EMP
WHERE  EMP_ID IN (SELECT DEPT.SAL
                  FROM   DEPT);

然后你会得到你期待的错误。