次の方法で共有


テーブル以外のものを使用してクエリを作成する (Visual Database Tools)

適用対象:SQL Server

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

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

ビューから行を選択できます。 たとえば、データベースに "ExpensiveBooks" という名前のビューが含まれているとします。各行には、価格が 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  

クエリにビューを追加する方法の詳細については、「クエリへのテーブルの追加 (Visual Database Tools)」を参照してください。

テーブルの代わりにクエリを使用する

クエリから行を選択できます。 たとえば、共同編集された書籍 (複数の著者を含む書籍) のタイトルと識別子を取得するクエリを既に記述しているとします。 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") が使用されることに注意してください。 エイリアスの詳細については、「テーブル エイリアスの作成 (Visual Database Tools)」および「列エイリアスの作成 (Visual Database Tools) を参照してください。

同様に、クエリは 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  
        )  

クエリへのクエリの追加の詳細については、「クエリへのテーブルの追加 (Visual Database Tools)」を参照してください。

テーブルの代わりに User-Defined 関数を使用する

SQL Server 2000 以降では、テーブルを返すユーザー定義関数を作成できます。 このような関数は、複雑なロジックや手続き型のロジックを実行するのに役立ちます。

たとえば、従業員テーブルに追加の列 (employee.manager_emp_id) が含まれており、外部キーがmanager_emp_idからemployee.emp_idに存在するとします。 従業員テーブルの各行内のmanager_emp_id列は、従業員の上司を示します。 より正確には、従業員の上司のemp_idを示します。 特定の上位レベルのマネージャーの組織階層内で働く従業員ごとに 1 つの行を含むテーブルを返すユーザー定義関数を作成できます。 関数fn_GetWholeTeamを呼び出し、入力変数 (チームを取得するマネージャーのemp_id) を受け取るように設計することができます。

fn_GetWholeTeam関数をデータ ソースとして使用するクエリを記述できます。 結果の SQL は次のようになります。

SELECT *   
FROM   
     fn_GetWholeTeam ('VPA30890F')  

"VPA30890F" は、取得する組織のマネージャーのemp_idです。 クエリにユーザー定義関数を追加する方法の詳細については、「クエリへのテーブルの追加 (Visual Database Tools)」を参照してください。 ユーザー定義関数の詳細については、「User-Defined Functions」を参照してください。