为什么使用内联视图..??
6 回答
使用内联视图有很多不同的原因。有些事情没有内联视图就无法完成,例如:
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 变得更容易。
内联视图是 Oracle SQL 中的一种构造,您可以在其中将查询放在 SQL FROM 子句中,就像查询是表名一样。
内联视图提供
- 可以在语句内部引入绑定变量来限制数据
- 更好地控制调音
- 代码可见性
内联视图可以被视为以某种方式对所需数据集做出贡献的中间结果集。有时这完全是为了提高代码的可维护性,有时它在逻辑上是必要的。
获取前 N 个有序行。
SELECT name, salary,
FROM (SELECT name, salary
FROM emp
ORDER BY salary DESC)
WHERE rownum <= 10;
Oracle Database Concepts文档中有内联视图概念定义:
内联视图不是模式对象。它是一个带有别名(相关名称)的子查询,您可以像 SQL 语句中的视图一样使用它。
关于子查询,请参阅 Oracle 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 ...
- 简化一些视图无法提供帮助的查询。例如,当视图需要从主查询中过滤时。
您将经常使用内联视图将查询分解为逻辑部分,这有助于提高可读性并使编写更复杂的查询更容易一些。
Jva 和 Tony Andrews 提供了一些有用的简单案例的很好示例,例如 Top-N 或分页查询,您可能希望在将其用作更大查询的一部分之前执行查询并对其结果进行排序,这反过来可能会提供执行某些其他处理的查询,其中这些单独查询的逻辑很难在单个查询中实现。
另一种可能非常有用的情况是,如果您正在编写一个将各种表连接在一起的查询,并希望对某些表执行聚合,在执行连接之前将组函数和处理分成不同的内联视图,这样管理基数会容易得多. 如果您想要一些示例,我很乐意提供它们以使其更清楚。
分解子查询(您在查询开头的 WITH 子句中列出您的查询)和内联视图通常也会带来性能优势。如果需要多次访问子查询的结果,只需要运行一次,就可以实现为全局临时表(优化器的作用并不完全非黑即白,我就不赘述了)在这里,但您可以进行自己的研究 - 例如,请参阅http://jonathanlewis.wordpress.com/2007/07/26/subquery-factoring-2/)