甲骨文内嵌视图(oracle-inline view)

2019-07-30 08:19发布

为什么内嵌视图用于..?

Answer 1:

有使用内嵌视图的许多不同的原因。 有些事情不能没有内嵌视图来完成,例如:

1)过滤上的解析函数的结果:

select ename from
( select ename, rank() over (order by sal desc) rnk
  from emp
)
where rnk < 4;

2)责令结果使用ROWNUM:

select ename, ROWNUM from
( select ename
  from emp
  order by ename
);

其他时候,他们只是更容易写你想要写的SQL。



Answer 2:

内联视图是Oracle SQL中的构造物,其中您可以将查询的SQL FROM,从句,就好像查询是一个表名。

内嵌视图提供

  1. 绑定变量可以限制数据的语句内推出
  2. 在调整更好地控制
  3. 可视性码


Answer 3:

为了得到前N下令行。

SELECT name, salary, 
FROM (SELECT name, salary
      FROM emp
      ORDER BY salary DESC)
WHERE rownum <= 10;


Answer 4:

内嵌视图可以被认为是有助于所需要的数据以某种方式设置的中间结果集合。 有时,它是完全改善代码的可维护性的问题,有时它在逻辑上是neccessary。



Answer 5:

从Oracle数据库概念文件有该内嵌视图概念定义 :

内嵌视图不是架构对象。 这是一个别名(相关名称)的子查询,你可以用这样一个SQL语句中的视图。

关于子查询看在使用子查询从甲骨文SQL参考手册。 它有一个非常漂亮的教学信息。

不管怎么说,今天最好使用子查询分解条款即是使用内嵌视图的功能更强大的方式。

作为所有在一起的例子:

WITH 
   dept_costs AS (
      SELECT department_name, SUM(salary) dept_total
         FROM employees e, departments d
         WHERE e.department_id = d.department_id
      GROUP BY department_name),
   avg_cost AS 
SELECT * FROM dept_costs
   WHERE dept_total >
      (SELECT avg FROM (SELECT SUM(dept_total)/COUNT(*) avg
                          FROM dept_costs)
      )
      ORDER BY department_name;  

在那里,你可以看到所有之一:

  • 内嵌视图的查询: SELECT SUM...
  • 相关子查询: SELECT avg FROM...
  • 一个子查询分解: dept_costs AS (...

什么是他们使用?:

  • 为了避免创建中间视图对象: CREATE VIEW ...
  • 为了简化一些查询,一个视图不能是有益的。 例如,当视图需要从主查询进行过滤。


Answer 6:

你会经常使用内嵌视图来打破你的查询成,这有助于双方可读性,使编写更复杂的查询更容易一点逻辑部分。

JVA和托尼·安德鲁斯提供了简单的情况下,一些很好的例子在那里,这是有用的,例如,您可能要执行的查询和使用,作为一个大的查询的一部分,而这又可能传播之前责令其结果从高到低的N或分页查询查询做一些其它处理,其中对于这些单个查询的逻辑将是难以实现在单个查询。

他们可以是非常有用的另一种情况是,如果你正在编写连接各种表一起查询,并希望对一些表执行聚集,在执行加入之前分隔的组功能和加工成不同的直列观点使管理的基数容易得多。 如果你想要一些例子,我会很乐意为他们提供以使其更清晰。

保理子查询和内联视图(你在哪里查询的开始列出您的疑问在WITH子句中)也往往会带来性能优势。 如果您需要访问的子查询多次的结果,你只需要运行一次,它可以物化为一个全局临时表(优化器的行为是不完全的黑白,所以我不会进入它在这里,但你可以做自己的研究-例如,看到http://jonathanlewis.wordpress.com/2007/07/26/subquery-factoring-2/ )



文章来源: oracle-inline view