SELECT in_ev.type, pl.name, in_ev.year
FROM places pl INNER JOIN (SELECT e.type, e.place_id, e.year
FROM events e)in_ev ON in_ev.place_id=pl.place_id
WHERE EXISTS (SELECT 1 FROM in_ev sub_ev WHERE sub_ev.year=1994)
我试图了解如何处理内联视图,以及为什么我们不能将它们用作子句子句中的"源表"。当我尝试运行此查询时,我会得到 ora-00942:表或视图不存在
摘要上方仅出于插图原因。
普通表和内联视图之间的存储和处理的确切差异是什么?
where
子句中的子查询只是看不见内联视图,我想您已经知道了。确实,这是一个范围问题。没有存储空间,以及如何在内存和处理中进行管理,这在某种程度上取决于优化器 - 例如,它可能会重写事物。我想在评估内联视图之前,可以从逻辑上评估该子查询。
当解析器实际执行查询之前抛出ORA-00942时,如何处理内联视图是一个有点点的点。
您可以使用子查理分解:
WITH in_ev AS (
SELECT e.type, e.place_id, e.year
FROM events e
)
SELECT in_ev.type, pl.name, in_ev.year
FROM places pl INNER JOIN in_ev ON in_ev.place_id=pl.place_id
WHERE EXISTS (SELECT 1 FROM in_ev sub_ev WHERE sub_ev.year=1994)
在这样一个人为的例子中看起来很奇怪,但是您承认这在问题上是说明性的。where
子句中的子查询 can 请参阅CTE-它的范围与解析器。
正如@mathguy在评论中指出的那样,优化器仍然可以将CTE视为子查询,但这通常不是您需要担心的事情 - 特别是如果您只是想避免遇到的错误。