方法 : 自己結合を手動作成する
データベースでテーブルに再帰リレーションシップが設定されていなくても、テーブルをテーブル自身に結合できます。 たとえば、自己結合を使用して、同じ市に住む著者の組を検索できます。
ほかの結合と同様に、自己結合にも少なくとも 2 つのテーブルが必要です。 ほかの結合と異なる点は、クエリにほかのテーブルを追加する代わりに、同じテーブルの 2 番目のインスタンスを追加する点です。 このように、テーブルの最初のインスタンスの列と 2 番目のインスタンスの同じ列を比較することによって、列の値を相互に比較できます。 テーブルの 2 番目のインスタンスには、クエリおよびビュー デザイナーによって別名が割り当てられます。
たとえば、自己結合を作成してバークレイに住む著者の組み合わせをすべて検索する場合は、テーブルの最初のインスタンスの city 列と 2 番目のインスタンスの city 列とを比較します。 作成したクエリは次のようになります。
SELECT
authors.au_fname,
authors.au_lname,
authors1.au_fname AS Expr2,
authors1.au_lname AS Expr3
FROM
authors
INNER JOIN
authors authors1
ON authors.city
= authors1.city
WHERE
authors.city = 'Berkeley'
自己結合の作成には、複数の結合条件が必要になることがあります。 その理由を理解するために、上記のクエリの結果を検討してみます。
Cheryl Carson Cheryl Carson
Abraham Bennet Abraham Bennet
Cheryl Carson Abraham Bennet
Abraham Bennet Cheryl Carson
最初の行は、Cheryl Carson が Cheryl Carson と同じ市に住んでいることを示すため、意味がありません。 2 番目の行も同様に役に立ちません。 これらの無意味なデータを削除するために、2 つの著者名が違う著者を示す場合だけ結果行を残すように条件を追加します。 作成したクエリは次のようになります。
SELECT
authors.au_fname,
authors.au_lname,
authors1.au_fname AS Expr2,
authors1.au_lname AS Expr3
FROM
authors
INNER JOIN
authors authors1
ON authors.city
= authors1.city
AND authors.au_id
<> authors1.au_id
WHERE
authors.city = 'Berkeley'
結果セットは、次のように改善されます。
Cheryl Carson Abraham Bennet
Abraham Bennet Cheryl Carson
しかしこの 2 つの結果行も冗長です。 最初の行は、Carson が Bennet と同じ市に住んでいることを示し、2 番目の行は、Bennet が Carson と同じ市に住んでいることを示しています。 このような冗長を避けるには、2 番目の結合条件を "等しくない" から "小なり" に変更します。作成したクエリは次のようになります。
SELECT
authors.au_fname,
authors.au_lname,
authors1.au_fname AS Expr2,
authors1.au_lname AS Expr3
FROM
authors
INNER JOIN
authors authors1
ON authors.city
= authors1.city
AND authors.au_id
< authors1.au_id
WHERE
authors.city = 'Berkeley'
結果セットは次のようになります。
Cheryl Carson Abraham Bennet
注意
次の手順で参照している Visual Studio ユーザー インターフェイス要素の一部は、お使いのコンピューターでは名前や場所が異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。
自己結合を手動作成するには
処理するテーブルまたはテーブル値オブジェクトをダイアグラム ペインに追加します。
同じテーブルを再度追加します。ダイアグラム ペインに同じテーブルまたはテーブル値オブジェクトが 2 つ表示されます。
2 番目のインスタンスには、テーブル名の後に順序番号が付加された別名が割り当てられます。 さらに、ダイアグラム ペインの中のテーブルまたはテーブル値オブジェクトの 2 つのオカレンスの間に結合線が表示されます。
結合線を右クリックし、ショートカット メニューの [プロパティ] をクリックします。
[プロパティ] ウィンドウの [結合条件と種類] をクリックし、その右側にある省略記号 [(...)] をクリックします。
結合のダイアログ ボックスで、主キー間の比較演算子を必要に応じて変更します。 たとえば、演算子を小なり (<) に変更できます。
テーブルまたはテーブル値オブジェクトの最初のオカレンスにある最初の結合列をドラッグし、2 番目のオカレンスの対応する列にドロップして、追加の結合条件 (たとえば、authors.zip = authors1.zip) を作成します。
出力列、検索条件、並べ替え順序など、クエリのほかのオプションを指定します。