自己結合の必要性がわかりません。誰か説明してくれませんか?
簡単な例は非常に役に立ちます。
自己結合を 2 つの同一のテーブルとして表示できます。ただし、正規化では、テーブルのコピーを 2 つ作成することはできないため、自己結合を使用して 2 つのテーブルをシミュレートするだけです。
次の 2 つのテーブルがあるとします。
emp1Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
emp2Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
ここで、各従業員の名前と上司の名前を取得する場合:
select c1.Name , c2.Name As Boss
from emp1 c1
inner join emp2 c2 on c1.Boss_id = c2.Id
次の表が出力されます。
Name Boss
ABC XYZ
DEF ABC
XYZ DEF
それ自体を参照するテーブルがある場合、これは非常に一般的です。例: すべての従業員がマネージャーを持つことができる従業員テーブルで、すべての従業員とそのマネージャーの名前をリストしたいとします。
SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
自己結合は、テーブルとそれ自体の結合です。
一般的な使用例は、テーブルにエンティティ (レコード) が格納され、それらの間に階層関係がある場合です。たとえば、個人情報 (名前、生年月日、住所...) を含むテーブルと、父親 (および/または母親) の ID が含まれる列を含むテーブルです。次に、次のような小さなクエリで
SELECT Child.ID, Child.Name, Child.PhoneNumber, Father.Name, Father.PhoneNumber
FROM myTableOfPersons As Child
LEFT OUTER JOIN myTableOfPersons As Father ON Child.FatherId = Father.ID
WHERE Child.City = 'Chicago' -- Or some other condition or none
同じクエリで、子供と父親 (および母親、2 番目の自己結合など、さらには祖父母など) の両方に関する情報を取得できます。
users次のように設定された table があるとします。
この状況で、ユーザーの情報とマネージャーの情報の両方を 1 つのクエリで取得したい場合は、次のようにします。
SELECT users.user_id, users.user_name, managers.user_id AS manager_id, managers.user_name AS manager_name INNER JOIN users AS manager ON users.manager_id=manager.user_id
Employee以下に説明するように呼ばれるテーブルを想像してください。すべての従業員には、従業員でもあるマネージャーがいます (manager_id が null になる CEO を除く)。
Table (Employee):
int id,
varchar name,
int manager_id
次に、次の選択を使用して、すべての従業員とそのマネージャーを検索できます。
select e1.name, e2.name as ManagerName
from Employee e1, Employee e2 where
where e1.manager_id = e2.id
テーブルがそれ自体を参照する機能がなければ、階層内のレイヤーの数と同じ数の階層レベルのテーブルを作成する必要があります。しかし、その機能が利用可能であるため、テーブルをそれ自体に結合すると、SQL はそれを 2 つの別個のテーブルとして扱うため、すべてが 1 か所に適切に格納されます。
テーブルが自己参照型である場合に役立ちます。たとえば、ページのテーブルの場合、各ページにはnextandpreviousリンクがあります。これらは、同じテーブル内の他のページの ID になります。ある時点で、連続したページのトリプルを取得したい場合は、同じテーブルの列を使用してnextおよび列で 2 つの自己結合を実行します。previousid
ここには多くの正解がありますが、同じように正しいバリエーションがあります。結合条件は、WHERE 句の代わりに結合ステートメントに配置できます。
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 RIGHT JOIN Employee e2 ON e1.emp_id = e2.emp_id
e1.manager_id > e2.id が必要な場合があることに注意してください
両方のシナリオを知る利点は、大量の WHERE または JOIN 条件があり、コードを読みやすくするために、他の句に自己結合条件を配置したい場合があることです。
従業員にマネージャーがいない場合に何が起こるかについて誰も言及していません。は?これらは結果セットには含まれません。マネージャーを持たない従業員を含めたいが、間違った組み合わせが返されないようにしたい場合はどうすればよいでしょうか?
この子犬を試してみてください。
SELECT e1.emp_id AS 'Emp_ID'
, e1.emp_name AS 'Emp_Name'
, e2.emp_id AS 'Manager_ID'
, e2.emp_name AS 'Manager_Name'
FROM Employee e1 LEFT JOIN Employee e2
ON e1.emp_id = e2.emp_id
AND e1.emp_name = e2.emp_name
AND e1.every_other_matching_column = e2.every_other_matching_column
自己結合は、テーブルのデータをそれ自体で評価する必要がある場合に役立ちます。つまり、同じテーブルの行を関連付けます。
Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName
たとえば、初期指定が現在の指定と等しい従業員の名前を検索したいとします。次の方法で自己結合を使用してこれを解決できます。
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
1 つの使用例は、データベース内の重複レコードをチェックすることです。
SELECT A.Id FROM My_Bookings A, My_Bookings B
WHERE A.Name = B.Name
AND A.Date = B.Date
AND A.Id != B.Id
これは、リンクされたリスト/ツリーに相当するデータベースであり、行には別の行への参照がある程度含まれています。
これは、一般的な用語での自己結合の説明です。自己結合は別のタイプの結合ではありません。他のタイプの結合 (内部結合、外部結合、およびクロス結合) を理解していれば、自己結合は簡単です。INNER、OUTER、および CROSS JOINS では、2 つ以上の異なるテーブルを結合します。ただし、自己結合では、同じテーブルをそのレフで結合します。ここでは、2 つの異なるテーブルはありませんが、テーブル エイリアスを使用して同じテーブルを別のテーブルとして扱います。それでもわからない場合は、次の YouTube ビデオをご覧になることをお勧めします。