この記事では、SQLの自己結合の概要と、基本的な例について説明します。
セルフジョインとは何ですか?
SQL SELF JOIN
テーブルをそれ自体に結合しています。同じテーブル内の階層データをクエリしたり、同じテーブル内の行を比較したりする場合に便利です。
例1-自己左結合
自己結合の典型的な例は、Employeesテーブルにあります。このような表では、ある従業員が別の従業員に報告する場合があります。したがって、自己結合を使用して、従業員ID列とマネージャーID列のテーブルを結合できます。
次の表があるとします。
+--------------+-------------+------------+-------------+ | EmployeeId | FirstName | LastName | ReportsTo | |--------------+-------------+------------+-------------| | 1 | Homer | Connery | NULL | | 2 | Bart | Pitt | 1 | | 3 | Maggie | Griffin | 1 | | 4 | Peter | Farnsworth | 2 | | 5 | Marge | Morrison | NULL | | 6 | Lisa | Batch | 5 | | 7 | Dave | Zuckerberg | 6 | | 8 | Vlad | Cook | 7 | +--------------+-------------+------------+-------------+
このテーブルで自己左結合を実行して、すべての従業員とそのマネージャーを返すことができます。
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
LEFT JOIN Employees e2
ON e1.ReportsTo = e2.EmployeeId;
結果:
+------------------+-----------------+ | Employee | Manager | |------------------+-----------------| | Homer Connery | | | Bart Pitt | Homer Connery | | Maggie Griffin | Homer Connery | | Peter Farnsworth | Bart Pitt | | Marge Morrison | | | Lisa Batch | Marge Morrison | | Dave Zuckerberg | Lisa Batch | | Vlad Cook | Dave Zuckerberg | +------------------+-----------------+
HomerConneryとMargeMorrisonは誰にも報告しないため、Manager
フィールドが空白です。実際には、NULL
になります 2つの列で文字列の連結を実行していなかった場合。
例2–自己内部参加
2つのヘッドホンチョを返却したくない場合は、テーブルで内部結合を行うことができます。これにより、両方のテーブルで一致しない行(つまり、対応するマネージャーがいない従業員、またはその逆)が削除されます。
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Employee,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Manager
FROM Employees e1
INNER JOIN Employees e2
ON e1.ReportsTo = e2.EmployeeId;
結果:
+------------------+-----------------+ | Employee | Manager | |------------------+-----------------| | Bart Pitt | Homer Connery | | Maggie Griffin | Homer Connery | | Peter Farnsworth | Bart Pitt | | Lisa Batch | Marge Morrison | | Dave Zuckerberg | Lisa Batch | | Vlad Cook | Dave Zuckerberg | +------------------+-----------------+
例3–自己右結合
自己右結合を実行する場合は、クエリ内のいくつかの列をシャッフルする必要があります。
SELECT
CONCAT(e1.FirstName, ' ', e1.LastName) AS Manager,
CONCAT(e2.FirstName, ' ', e2.LastName) AS Employee
FROM Employees e1
RIGHT JOIN Employees e2
ON e1.EmployeeId = e2.ReportsTo;
結果:
+-----------------+------------------+ | Manager | Employee | |-----------------+------------------| | | Homer Connery | | Homer Connery | Bart Pitt | | Homer Connery | Maggie Griffin | | Bart Pitt | Peter Farnsworth | | | Marge Morrison | | Marge Morrison | Lisa Batch | | Lisa Batch | Dave Zuckerberg | | Dave Zuckerberg | Vlad Cook | +-----------------+------------------+