2016-05-16 67 views
0

我有两个表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表中的记录。

回答

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); 

,那么你会得到你的错误期待着。

+0

谢谢你的澄清。我尝试通过使用别名,并得到一个错误。 – hemalp108

0

这发生在子查询的结果不为null时。

你的情况似乎是,奇怪的是,而不是报告错误,列不存在,结果是,以非空,然后选择顶部返回还在做