我有两张桌子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 :(得分: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);
然后你会得到你期待的错误。