如果内部 SELECT 包含无效标识符,则强制外部 SELECT 失败

Force outer SELECT to fail if the inner SELECT contains an invalid identifier

如果

SELECT ID FROM T2

失败,并显示以下消息:

Error: ORA-00904: "ID": invalid identifier

为什么不会

SELECT * 
    FROM T1
    WHERE ID IN 
        ( 
            SELECT ID FROM T2
        )

失败? (它 returns 来自 T1 的所有条目)

是否可以更改此默认行为?
(运行 相同的查询,但得到错误而不是所有行)


我有:

但是假设我错误地使用了 SELECT ID FROM T2(参见上面的示例)而不是 SELECT ID2 FROM T2。在这种情况下没有发生任何错误,因为我使用 SELECT ... IN SELECT ...,但如果将其替换为 DELETE ... IN SELECT ...,它可能会产生重大损害。

是的。

SELECT * 
    FROM T1
    WHERE ID IN 
        ( 
            SELECT T2.ID FROM T2
        )

解释行为

但您也问过:“是否可以更改此默认行为? (运行 相同的查询,但得到的是错误而不是所有行)”,并在 "I want to force the failure for the same query, not to change the query to get the wanted result".

的评论中对其进行了扩展

不,无法更改行为。它正在做 the documentation 说它应该做的事:

Oracle resolves unqualified columns in the subquery by looking in the tables named in the subquery and then in the tables named in the parent statement.

你不能让它停止查看父语句而只解析子查询中的非限定别名。您将不得不更改查询以使其出错。没有理由 限定您的标识符,而且您应该这样做的原因有很多,包括它可以防止您掩盖代码中的错误。