自己結合を使用する

完了

これまで使用した結合には、さまざまなテーブルが含まれています。 テーブルから行を取得し、同じテーブル内の他の行と比較する必要がある場合があります。 たとえば、人事アプリケーションで、Employee テーブルに各従業員のマネージャーに関する情報が含まれ、その従業員の行にマネージャーの ID が格納されるとします。 各マネージャーも、従業員としてリストされます。

EmployeeID

FirstName

ManagerID

1

Dan

NULL

2

Aisha

1

3

Rosie

1

4

Naomi

3

従業員情報を取得し、関連するマネージャーと照合するには、クエリでテーブルを 2 回使用し、クエリの目的のためにテーブルをそれ自体に結合します。

SELECT emp.FirstName AS Employee, 
       mgr.FirstName AS Manager
FROM HR.Employee AS emp
LEFT OUTER JOIN HR.Employee AS mgr
  ON emp.ManagerID = mgr.EmployeeID;

このクエリの結果には、マネージャーの名前を含む各従業員の行が含まれます。 会社の CEO にはマネージャーがいません。 結果に CEO を含めるために、外部結合が使用され、ManagerID フィールドに一致する EmployeeID フィールドがない行に対して、マネージャー名が NULL として返されます。

Employee

管理者

Dan

NULL

Aisha

Dan

Rosie

Dan

Naomi

Rosie

テーブルの行を、同じテーブル内の他の行と比較する必要がある場合もあります。 既に説明したように、T-SQL を使用して同じ行の列を比較するのは非常に簡単ですが、異なる行 (たとえば、開始時刻を格納する行と、対応する停止時刻を格納する同じテーブル内の別の行) の値を比較する方法はそれほど明確ではありません。 自己結合は、このような種類のクエリに有用な手法です。

このようなタスクを実行するには、次のガイドラインを考慮する必要があります。

  • FROM 句で同じテーブルの 2 つのインスタンスを定義し、必要に応じて内部結合または外部結合を使用して結合します。
  • テーブルのエイリアスを使用して、同じテーブルの 2 つのインスタンスを区別します。
  • ON 句を使用して、テーブルの 1 つのインスタンスの列をテーブルの別のインスタンスの列と比較するフィルターを指定します。