Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
применимо к:SQL Server
Всякий раз, когда вы пишете запрос на получение, сформулируете нужные столбцы, какие строки требуется, а также где обработчик запросов должен найти исходные данные. Как правило, эти исходные данные состоят из таблицы или нескольких таблиц, объединенных вместе. Но исходные данные могут поступать из источников, отличных от таблиц. На самом деле это может поступать из представлений, запросов, синонимов или определяемых пользователем функций, возвращающих таблицу.
Использование представления вместо таблицы
Вы можете выбрать строки из представления. Например, предположим, что база данных содержит представление "Дорогие книги", в котором каждая строка описывает название, цена которого превышает 19,99. Определение представления может выглядеть следующим образом:
SELECT *
FROM titles
WHERE price > 19.99;
Вы можете выбрать дорогие книги по психологии, просто выбрав книги по психологии из представления ExpensiveBooks. Результирующий SQL может выглядеть следующим образом:
SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology';
Аналогичным образом представление может участвовать в JOIN
операции. Например, вы можете найти продажи дорогих книг только путем присоединения таблицы продаж к представлению ExpensiveBooks. Результирующий SQL может выглядеть следующим образом:
SELECT *
FROM sales
INNER JOIN ExpensiveBooks
ON sales.title_id = ExpensiveBooks.title_id;
Дополнительные сведения о добавлении представления в запрос см. в разделе "Добавление таблиц в запросы" (визуальные инструменты для баз данных).
Использование запроса вместо таблицы
Вы можете выбрать строки из запроса. Например, предположим, что вы уже написали запрос на получение названий и идентификаторов совместно созданных книг — книг с несколькими авторами. SQL может выглядеть следующим образом:
SELECT titles.title_id,
title,
type
FROM titleauthor
INNER JOIN titles
ON titleauthor.title_id = titles.title_id
GROUP BY titles.title_id, title, type
HAVING COUNT(*) > 1;
Затем вы можете написать другой запрос, который строится на этом результате. Например, можно написать запрос, который извлекает книги на тему психологии, написанные в соавторстве. Для записи этого нового запроса можно использовать существующий запрос в качестве источника данных нового запроса. Результирующий SQL может выглядеть следующим образом:
SELECT title
FROM (SELECT titles.title_id,
title,
type
FROM titleauthor
INNER JOIN titles
ON titleauthor.title_id = titles.title_id
GROUP BY titles.title_id, title, type
HAVING COUNT(*) > 1) AS co_authored_books
WHERE type = 'psychology';
Выделенный текст показывает существующий запрос, используемый в качестве источника данных нового запроса. Новый запрос использует псевдоним ("co_authored_books") для существующего запроса. Дополнительные сведения о псевдонимах см. в статьях "Создание псевдонимов таблиц" (визуальные инструменты для баз данных) и "Создание псевдонимов столбцов" (визуальные инструменты для баз данных).
Аналогичным образом запрос может участвовать в JOIN
операции. Например, вы можете найти продажи дорогих книг, написанных в соавторстве, просто объединив представление ExpensiveBooks с запросом, извлекающим эти книги. Результирующий SQL может выглядеть следующим образом:
SELECT
ExpensiveBooks.title
FROM
ExpensiveBooks
INNER JOIN
(
SELECT
titles.title_id,
title,
type
FROM
titleauthor
INNER JOIN
titles
ON titleauthor.title_id
= titles.title_id
GROUP BY
titles.title_id,
title,
type
HAVING COUNT(*) > 1
)
Дополнительные сведения о добавлении запроса в запрос см. в разделе "Добавление таблиц в запросы" (визуальные инструменты для баз данных).
Использование определяемой пользователем функции вместо таблицы
Вы можете создать определяемую пользователем функцию, которая возвращает таблицу. Такие функции полезны для выполнения сложной или процедурной логики.
Например, предположим, что таблица сотрудников содержит дополнительный столбец, employee.manager_emp_id
и что внешний ключ существует от manager_emp_id до employee.emp_id
. В каждой строке таблицы manager_emp_id
сотрудника столбец указывает босса сотрудника. Точнее, это указывает на босса emp_id
сотрудника. Вы можете создать определяемую пользователем функцию, которая возвращает таблицу, содержащую одну строку для каждого сотрудника, работающего в определенной иерархии организации руководителя высокого уровня. Вы можете вызвать функцию fn_GetWholeTeam и создать ее, чтобы взять входную переменную — emp_id
руководителя, команда которого требуется получить.
Вы можете написать запрос, использующий функцию fn_GetWholeTeam в качестве источника данных. Результирующий SQL может выглядеть следующим образом:
SELECT *
FROM fn_GetWholeTeam('VPA30890F');
VPA30890F
emp_id
— это менеджер, организация которого требуется получить. Дополнительные сведения о добавлении определяемой пользователем функции в запрос см. в разделе "Добавление таблиц в запросы" (визуальные инструменты для баз данных). Полное описание определяемых пользователем функций см. в разделе " Определяемые пользователем функции".