自己結合を使用する
これまで使用した結合には、さまざまなテーブルが含まれています。 テーブルから行を取得し、同じテーブル内の他の行と比較する必要がある場合があります。 たとえば、人事アプリケーションで、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 つのインスタンスの列をテーブルの別のインスタンスの列と比較するフィルターを指定します。