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:表或视图不存在
以上代码段仅供参考。
普通表和内联视图之间存储和处理的确切区别是什么?
答案 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视为子查询,但这通常不需要担心 - 特别是如果你只是想避免你得到的错误。