自己結合の必要性がわかりません。誰かが私にそれらを説明してもらえますか?
簡単な例が非常に役立ちます。
回答:
自己結合は、2つの同一のテーブルとして表示できます。ただし、正規化では、テーブルの2つのコピーを作成できないため、自己結合を使用して2つのテーブルを持つことをシミュレートするだけです。
2つのテーブルがあるとします。
emp1
Id Name Boss_id
1 ABC 3
2 DEF 1
3 XYZ 2
emp2
Id 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
left join
上司がいない従業員(または上司)を除外しないほうがいいと思います。トップ犬!
それ自体を参照するテーブルがある場合、それは非常に一般的です。例:すべての従業員がマネージャーを持つことができ、すべての従業員とそのマネージャーの名前を一覧表示する従業員テーブル。
SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
自己結合は、テーブルとそれ自体の結合です。
一般的な使用例は、テーブルに、それらの間に階層関係を持つエンティティ(レコード)が格納されている場合です。たとえば、個人情報(名前、DOB、住所など)を含み、父親(および/または母親)の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番目の自己結合など、さらには祖父母など)に関する情報を取得できます。
これらは、テーブルが自己参照型である場合に役立ちます。たとえば、ページのテーブルの場合、各ページにnext
とprevious
リンクが含まれる場合があります。これらは、同じテーブル内の他のページのIDになります。ある時点で、連続するページのトリプルを取得したい場合は、同じテーブルの列を持つ列next
とprevious
列で2つの自己結合を実行し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
上記の回答(非常によく説明されています)とは別に、自己結合の使用法を簡単に示すことができるように、1つの例を追加したいと思います。次の属性を持つCUSTOMERSという名前のテーブルがあるとします:CustomerID、CustomerName、ContactName、City、Country。ここで、「同じ都市」から来たすべての人をリストします。CITYに基づいて結合できるように、このテーブルのレプリカを考える必要があります。以下のクエリは、それが何を意味するかを明確に示しています。
SELECT A.CustomerName AS CustomerName1, B.CustomerName AS CustomerName2,
A.City
FROM Customers A, Customers B
WHERE A.CustomerID <> B.CustomerID
AND A.City = B.City
ORDER BY A.City;
ここには多くの正解がありますが、同様に正しいバリエーションがあります。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 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
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
自己結合は、テーブルのデータをそれ自体で評価する必要がある場合に役立ちます。つまり、同じテーブルの行を相互に関連付けます。
Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName
たとえば、初期指定が現在の指定と等しい従業員の名前を検索したいとします。これは、次の方法で自己結合を使用して解決できます。
SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
これは、リンクリスト/ツリーに相当するデータベースであり、行には別の行への参照がある程度含まれています。
これは、素人の言葉での自己結合の説明です。自己結合は別の種類の結合ではありません。他のタイプの結合(内部結合、外部結合、および相互結合)を理解している場合は、自己結合は簡単です。INNER、OUTER、およびCROSS JOINSでは、2つ以上の異なるテーブルを結合します。ただし、自己結合では、同じテーブルをitslefで結合します。ここでは、2つの異なるテーブルはありませんが、テーブルエイリアスを使用して同じテーブルを別のテーブルとして扱います。それでもはっきりしない場合は、次のYouTubeビデオをご覧になることをお勧めします。