自己結合の例
複数のテーブルから行が取得されるリクエストとして結合が定義されている場合、自己結合は、1つのテーブルから行が取得されるリクエストとして大まかに定義することができます。このテーブルは相関名を使用して、名前が異なる同一のテーブルの2つのコピーがあるかのように見える2つのテーブルとして再定義されます。
同じ国に在住する従業員のすべての双方向ペアを特定するとします。これを特定するには、Employeeテーブルの自己結合を使用します。
従業員からの行は次のようになります。
| employee | |||
|---|---|---|---|
| emp_num | name | country | dept_num |
| 113722 | Lopes | United States | 115 |
| 225985 | Ghazal | United States | 115 |
| 577321 | Korlapati | United States | 115 |
| 783904 | Ramesh | India | 378 |
| 799106 | Manjula | India | 378 |
| 942764 | Ono | Japan | 915 |
同じ国に在住している従業員の双方向ペアを特定するには、次の自己結合リクエストを実行依頼します。
SELECT e.emp_num, e.name, f.emp_num, f.name, e.country FROM employee AS e, employee AS f WHERE e.country = f.country AND e.emp_num < f.emp_num ORDER BY e.emp_num, f.emp_num;
従業員の2つの異なる相関名を指定することによって、テーブルをテーブル自体に結合することができます。条件e.country = f.countryは同じ国に在住する従業員のみをペアにし、条件e.emp_num < f.emp_numは異なる従業員番号を持つ従業員のみをペアにします。
このリクエストによって次の結果のテーブルが生成されます。
| countryに基づく自己結合後のemployee | ||||
|---|---|---|---|---|
| emp_num | name | emp_num | name | country |
| 113722 | Lopes | 225085 | Ghazal | United States |
| 113722 | Lopes | 577321 | Korlapati | United States |
| 225085 | Ghazal | 577321 | Korlapati | United States |
| 783004 | Ramesh | 799106 | Manjula | India |