次の方法で共有


自己結合を手動作成する方法 (Visual Database Tools)

データベースでテーブルに再帰リレーションシップが設定されていなくても、テーブルをテーブル自身に結合できます。たとえば、自己結合を使用して、同じ市に住む著者の組を検索できます。

他の結合と同様に、自己結合にも少なくとも 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

自己結合を手動作成するには

  1. 処理するテーブルまたはテーブル値オブジェクトをダイアグラム ペインに追加します。

  2. 同じテーブルを再度追加します。ダイアグラム ペインに同じテーブルまたはテーブル値オブジェクトが 2 つ表示されます。

    2 番目のインスタンスには、テーブル名の後に順序番号が付加された別名が割り当てられます。さらに、ダイアグラム ペインの中のテーブルまたはテーブル値オブジェクトの 2 つのインスタンスの間に結合線が表示されます。

  3. 結合線を右クリックし、ショートカット メニューの [プロパティ] をクリックします。

  4. [プロパティ] ウィンドウの [結合条件と種類] をクリックし、プロパティの右側の省略記号 ([...]) をクリックします。

  5. [結合] ダイアログ ボックスで、主キー間の比較演算子を必要に応じて変更します。たとえば、演算子を小なり (<) に変更できます。

  6. テーブルまたはテーブル値オブジェクトの最初のインスタンスにある最初の結合列の名前をドラッグし、2 番目のインスタンスの対応する列にドロップして、追加の結合条件 (たとえば、authors.zip = authors1.zip) を作成します。

  7. 出力列、検索条件、並べ替え順序など、クエリの他のオプションを指定します。