oracle 内联视图

Posted

技术标签:

【中文标题】oracle 内联视图【英文标题】:oracle-inline view 【发布时间】:2009-07-17 09:35:37 【问题描述】:

为什么使用内联视图..??

【问题讨论】:

【参考方案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 变得更容易。

【讨论】:

重申第 1 点:asktom.oracle.com/pls/asktom/… 澄清第 2 点,它通常被称为分页。【参考方案2】:

内联视图是 Oracle SQL 中的一种结构,您可以在其中将查询放在 SQL FROM 子句中,就像查询是表名一样。

内嵌视图提供

    可以在语句内部引入绑定变量来限制数据 更好地控制调音 代码可见性

【讨论】:

可以在语句中引入绑定变量来限制数据——你能举个例子吗...【参考方案3】:

获取前 N 个有序行。

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

【讨论】:

【参考方案4】:

内联视图可以被视为以某种方式对所需数据集做出贡献的中间结果集。有时这完全是为了提高代码的可维护性,有时在逻辑上是必要的。

【讨论】:

【参考方案5】:

从Oracle Database Concepts 文档中有inline view concept definition:

内联视图不是架构对象。 这是一个带有别名的子查询 (相关名称),您可以使用 就像 SQL 语句中的视图。

关于子查询请查看Oracle SQL Reference 手册中的Using Subqueries。它有一个非常好的教学信息。

无论如何,今天更喜欢使用Subquery Factoring Clause,这是一种更强大的内联视图使用方式。

举个例子:

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 ... 用于简化视图无法提供帮助的某些查询。例如,当视图需要从主查询中过滤时。

【讨论】:

【参考方案6】:

您通常会使用内联视图将查询分解为逻辑部分,这有助于提高可读性,并使编写更复杂的查询更容易。

Jva 和 Tony Andrews 提供了一些有用的简单案例的很好示例,例如 Top-N 或分页查询,您可能希望在将其用作更大查询的一部分之前执行查询并对其结果进行排序,其中turn 可能会为查询提供一些其他处理,其中这些单独查询的逻辑很难在单个查询中实现。

另一个非常有用的情况是,如果您正在编写一个将多个表连接在一起的查询,并希望对某些表执行聚合,在执行连接之前将组函数和处理分成不同的内联视图,从而管理基数容易得多。如果您需要一些示例,我很乐意提供它们以使其更清楚。

分解子查询(您在查询开头的 WITH 子句中列出您的查询)和内联视图通常也会带来性能优势。如果你需要多次访问子查询的结果,你只需要运行一次,它就可以作为一个全局临时表来实现(优化器的行为并不是完全黑白的,所以我不会进入它在这里,但您可以自己研究 - 例如,请参阅 http://jonathanlewis.wordpress.com/2007/07/26/subquery-factoring-2/)

【讨论】:

以上是关于oracle 内联视图的主要内容,如果未能解决你的问题,请参考以下文章

数据库(Oracle)基本知识点总结

oracle不可以用order by么

Oracle优化笔记

内联视图和普通视图的关系以及和子查询的区别

内联函数和视图之间的区别

视图和内联表函数之间是不是存在性能差异?