оракул - PullRequest
       25

оракул

0 голосов
/ 17 июля 2009

Почему используются встроенные представления .. ??

Ответы [ 6 ]

4 голосов
/ 17 июля 2009

Существует много разных причин для использования встроенных представлений. Некоторые вещи не могут быть выполнены без встроенных представлений, например:

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, который вы хотите написать.

2 голосов
/ 17 июля 2009

Встроенное представление - это конструкция в Oracle SQL, где вы можете поместить запрос в предложение SQL FROM, как если бы запрос был именем таблицы.

Встроенные представления обеспечивают

  1. Переменные связывания могут быть введены внутри оператора для ограничения данных
  2. Лучший контроль над настройкой
  3. Видимость в коде
1 голос
/ 17 июля 2009

Из документа Oracle Database Concepts существует определение концепции inline view :

Встроенное представление не является объектом схемы. Это подзапрос с псевдонимом (название корреляции), которое вы можете использовать как представление внутри оператора SQL.

О подзапросах смотрите в Использование подзапросов из руководства Oracle SQL Reference . Это очень хорошая педагогическая информация.

В любом случае, сегодня предпочтительнее использовать Факторинг подзапроса , который является более мощным способом использования встроенных представлений.

Как пример всего вместе:

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 ...
  • Чтобы упростить некоторые запросы, которые представление не может быть полезным. Например, когда представление нужно отфильтровать от основного запроса.
1 голос
/ 17 июля 2009

Встроенное представление можно рассматривать как промежуточный набор результатов, который каким-то образом вносит вклад в требуемый набор данных. Иногда все дело в улучшении удобства сопровождения кода, а иногда это логически необходимо.

1 голос
/ 17 июля 2009

Чтобы получить топ N упорядоченных строк.

SELECT name, salary, 
FROM (SELECT name, salary
      FROM emp
      ORDER BY salary DESC)
WHERE rownum <= 10;
0 голосов
/ 17 июля 2009

Вы часто будете использовать встроенные представления, чтобы разбить ваш запрос на логические части, которые улучшат читабельность и немного упростят написание более сложных запросов.

Jva и Tony Andrews привели несколько хороших примеров простых случаев, когда это полезно, таких как запросы Top-N или Pagination, когда вы можете выполнить запрос и упорядочить его результаты, прежде чем использовать его как часть более крупного запроса, который в очередь может направить запрос, выполняя какую-то другую обработку, где логика для этих отдельных запросов будет трудно реализовать в одном запросе.

В другом случае они могут быть очень полезны, если вы пишете запрос, который объединяет различные таблицы, и хотите выполнить агрегирование некоторых таблиц, разделить групповые функции и обработать их на различные встроенные представления, прежде чем выполнять объединения, что сделает управление количеством элементов. намного проще Если вам нужны примеры, я был бы рад предоставить их, чтобы они стали более понятными.

Факторные подзапросы (где вы перечисляете свои запросы в предложении WITH в начале запроса) и встроенные представления также часто приносят выигрыш в производительности. Если вам нужно получить доступ к результатам подзапроса несколько раз, вам нужно запустить его только один раз, и его можно материализовать как глобальную временную таблицу (то, как работает оптимизатор, не совсем черно-белое, поэтому я не буду вдаваться в подробности). здесь, но вы можете провести собственное исследование - например, см. http://jonathanlewis.wordpress.com/2007/07/26/subquery-factoring-2/)

...