内联视图限制

时间:2016-12-23 23:46:55

标签: sql oracle inline-view

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:表或视图不存在

以上代码段仅供参考。

普通表和内联视图之间存储和处理的确切区别是什么?

1 个答案:

答案 0 :(得分:2)

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) 子句中的子查询只是看不到内联视图,我猜你已经想到了;这真是一个范围问题。没有存储,它在内存和处理过程中的管理方式有点落到优化器上 - 例如,它可能会大大改写。在我评估内联视图的评估之前,可以在逻辑上评估子查询。

由于解析器在实际执行查询之前抛出ORA-00942,所以如何处理内联视图是一个有争议的问题。

您可以使用子查询分解:

where

对于这样一个人为的例子看起来很奇怪,但你承认它在问题中是说明性的。 $('#myAlert .close').on('click', function() { $('#myAlert').fadeOut(300); if (typeof localStorage !== 'undefined') { localStorage.setItem('alert-closed', true); localStorage.removeItem("hidden"); } }); 子句中的子查询可以查看CTE - 它在解析器的范围内。

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