次の方法で共有


テーブル以外のものを使用してクエリを作成する (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) AS 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)」を参照してください。

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

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

たとえば、従業員テーブルに追加の列 ( 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)」を参照してください。 ユーザー定義関数の詳細については、「 ユーザー定義関数」を参照してください。