子查询无效但外部查询 returns 条记录
Invalid Subquery yet outer query returns the records
我有两个 table 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:标识符无效,但它 returns 来自 EMP table.
的记录
当子查询的结果不为空时会发生这种情况。
在你的情况下,奇怪的是,报告列不存在的错误,返回结果是为了非空然后select顶部仍然完成
这是因为 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);
那么你就会得到你所期望的错误。
我有两个 table 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:标识符无效,但它 returns 来自 EMP table.
的记录当子查询的结果不为空时会发生这种情况。
在你的情况下,奇怪的是,报告列不存在的错误,返回结果是为了非空然后select顶部仍然完成
这是因为 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);
那么你就会得到你所期望的错误。