【发布时间】:2009-07-17 09:35:37
【问题描述】:
为什么使用内联视图..??
【问题讨论】:
为什么使用内联视图..??
【问题讨论】:
使用内联视图有很多不同的原因。有些事情没有内联视图是无法完成的,例如:
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 文档中有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 ...
【讨论】:
您通常会使用内联视图将查询分解为逻辑部分,这有助于提高可读性,并使编写更复杂的查询更容易。
Jva 和 Tony Andrews 提供了一些有用的简单案例的很好示例,例如 Top-N 或分页查询,您可能希望在将其用作更大查询的一部分之前执行查询并对其结果进行排序,其中turn 可能会为查询提供一些其他处理,其中这些单独查询的逻辑很难在单个查询中实现。
另一个非常有用的情况是,如果您正在编写一个将多个表连接在一起的查询,并希望对某些表执行聚合,在执行连接之前将组函数和处理分成不同的内联视图,从而管理基数容易得多。如果您需要一些示例,我很乐意提供它们以使其更清楚。
分解子查询(您在查询开头的 WITH 子句中列出您的查询)和内联视图通常也会带来性能优势。如果你需要多次访问子查询的结果,你只需要运行一次,它就可以作为一个全局临时表来实现(优化器的行为并不是完全黑白的,所以我不会进入它在这里,但您可以自己研究 - 例如,请参阅 http://jonathanlewis.wordpress.com/2007/07/26/subquery-factoring-2/)
【讨论】: