適用対象: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)」を参照してください。 ユーザー定義関数の詳細については、「 ユーザー定義関数」を参照してください。