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


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

применимо к: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 Функции.