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

我试图了解如何处理内联视图以及为什么我们不能在 where 子句子查询中将它们用作“源表”。当我尝试运行此查询时,我得到ORA-00942:表或视图不存在

以上片段仅用于说明原因。

普通表和内联视图在存储和处理上的具体区别是什么?

4

1 回答 1

2

子句中的子查询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子句中的子查询可以看到 CTE - 它在解析器的范围内。

正如@mathguy 在评论中指出的那样,优化器可能仍将 CTE 视为子查询,但这通常不是您需要担心的事情 - 特别是如果您只是想避免遇到的错误。

于 2016-12-24T00:18:37.340 回答