为什么使用内联视图.. ??
答案 0 :(得分:4)
使用内联视图有许多不同的原因。如果没有内联视图,有些事情是无法完成的,例如:
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 :(得分:2)
内联视图是Oracle SQL中的一个构造,您可以在SQL FROM子句中放置查询,就像查询是表名一样。
内联视图提供
答案 2 :(得分:1)
获得前N个有序行。
SELECT name, salary,
FROM (SELECT name, salary
FROM emp
ORDER BY salary DESC)
WHERE rownum <= 10;
答案 3 :(得分:1)
内联视图可以视为以某种方式为所需数据集做出贡献的中间结果集。有时它完全是提高代码可维护性的问题,有时它在逻辑上是必要的。
答案 4 :(得分:1)
在Oracle Database Concepts文档中有inline view concept definition:
内联视图不是架构对象。 它是一个带别名的子查询 您可以使用的(相关名称) 就像SQL语句中的视图一样。
关于子查询,请查看Using Subqueries手册中的Oracle SQL Reference。它有一个非常好的教学信息。
无论如何,今天最好使用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 ...
答案 5 :(得分:0)
您经常使用内联视图将查询分解为逻辑部分,这有助于提高可读性并使编写更复杂的查询更容易。
Jva和Tony Andrews提供了一些简单案例的好例子,这些案例很有用,例如Top-N或Pagination查询,您可能希望在将查询作为更大查询的一部分使用之前执行查询并对其结果进行排序转向可能会在执行其他处理时提供查询,其中单个查询中很难实现这些单个查询的逻辑。
它们非常有用的另一种情况是,如果您正在编写将各种表连接在一起并希望对某些表执行聚合的查询,将组函数和处理分离到不同的内联视图,然后再执行连接,则需要管理基数更容易。如果你想要一些例子,我很乐意提供它们以使其更清晰。
Factored子查询(在查询开头的WITH子句中列出查询的位置)和内联视图通常也会带来性能优势。如果你需要多次访问子查询的结果,你只需要运行一次它就可以实现为全局临时表(优化器的行为不是完全黑白的,所以我不会进入它在这里,你可以做自己的研究 - 例如,见http://jonathanlewis.wordpress.com/2007/07/26/subquery-factoring-2/)