Поделиться через


Создание запросов с помощью чего-то помимо таблицы (визуальные инструменты для баз данных)

применимо к: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— это менеджер, организация которого требуется получить. Дополнительные сведения о добавлении определяемой пользователем функции в запрос см. в разделе "Добавление таблиц в запросы" (визуальные инструменты для баз данных). Полное описание определяемых пользователем функций см. в разделе " Определяемые пользователем функции".