次の方法で共有


方法 : テーブル以外のアイテムを使用してクエリを作成する

検索クエリを作成するときは常に、必要な列、必要な行、およびクエリ プロセッサが基になるデータを検索する場所を明示します。通常、この基になるデータは 1 つのテーブル、または相互に結合された複数のテーブルで構成されています。ただし、基になるデータは、テーブル以外のソースを使用してもかまいません。実際、ビュー、クエリ、シノニム、またはテーブルを返すユーザー定義関数のデータを使用できます。

テーブルに代わるビューの使用

ビューから行を選択できます。たとえば、"ExpensiveBooks" という名前のビューを含むデータベースがあり、このビューの各行には値段が $19.99 を超える書籍の書名が格納されているものとします。ビューの定義は次のようになります。

SELECT *
FROM titles
WHERE price > 19.99

ExpensiveBooks ビューから心理学の本を選択するだけで、高価な心理学の本を選択できます。結果の SQL ステートメントは次のようになります。

SELECT *
FROM ExpensiveBooks
WHERE type = 'psychology'

同様に、JOIN 演算でビューを使用できます。たとえば、sales テーブルと 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
        )

クエリにクエリを追加する方法の詳細については、「方法 : クエリにテーブルを追加する」を参照してください。

テーブルに代わるユーザー定義関数の使用

SQL Server 2000 以降では、テーブルを返すユーザー定義関数を作成できます。この種の関数は、複雑な論理または手順論理を実行するときに役に立ちます。

たとえば、employee テーブルに employee.manager_emp_id という列があり、manager_emp_id から employee.emp_id への外部キーが存在するものとします。employee テーブルの各行の manager_emp_id 列は従業員の上司を示します。より正確には、manager_emp_id 列は従業員の上司の emp_id を示しています。特定の上級管理者の組織階層に所属する各従業員に一対一で対応する行を含むテーブルを返す、ユーザー定義関数を作成できます。この関数に fn_GetWholeTeam という名前を付け、組織の情報を取得する管理者の emp_id を入力変数としてとるように関数をデザインします。

データの参照元として fn_GetWholeTeam 関数を使用するクエリを作成できます。結果の SQL ステートメントは次のようになります。

SELECT * 
FROM 
     fn_GetWholeTeam ('VPA30890F')

"VPA30890F" は、取得の対象となる組織の管理者の emp_id を示しています。クエリにユーザー定義関数を追加する方法の詳細については、「方法 : クエリにユーザー定義関数を追加する」および「方法 : クエリにテーブルを追加する」を参照してください。ユーザー定義関数の詳細については、SQL Server のドキュメントを参照してください。

参照

その他の技術情報

ストアド プロシージャおよびユーザー定義関数の使用