Создание запросов с помощью нечто кроме таблицы (визуальные инструменты базы данных)
применимо к: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
)
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
)
Дополнительные сведения о добавлении одного запроса к другому см. в разделе Добавление таблиц в запросы (Визуальные инструменты баз данных).
Использование функции User-Defined вместо таблицы
В SQL Server 2000 или более поздней версии можно создать определяемую пользователем функцию, которая возвращает таблицу. Такие функции полезны для выполнения сложной или процедурной логики.
Например, предположим, что таблица сотрудников содержит дополнительный столбец 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 руководителя, организация которого требуется получить. Дополнительные сведения о добавлении определяемой пользователем функции в запрос см. в добавления таблиц в запросы (визуальные инструменты баз данных). Полное описание определяемых пользователем функций см. в разделе User-Defined Функции.