94

自己結合の必要性がわかりません。誰か説明してくれませんか?

簡単な例は非常に役に立ちます。

4

13 に答える 13

106

自己結合を 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
于 2010-03-16T22:39:26.180 に答える
23

それ自体を参照するテーブルがある場合、これは非常に一般的です。例: すべての従業員がマネージャーを持つことができる従業員テーブルで、すべての従業員とそのマネージャーの名前をリストしたいとします。

SELECT e.name, m.name
FROM employees e LEFT OUTER JOIN employees m
ON e.manager = m.id
于 2010-03-16T22:15:52.457 に答える
19

自己結合は、テーブルとそれ自体の結合です。

一般的な使用例は、テーブルにエンティティ (レコード) が格納され、それらの間に階層関係がある場合です。たとえば、個人情報 (名前、生年月日、住所...) を含むテーブルと、父親 (および/または母親) の 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 番目の自己結合など、さらには祖父母など) の両方に関する情報を取得できます。

于 2010-03-16T22:18:34.067 に答える
5

users次のように設定された table があるとします。

  • ユーザーID
  • ユーザー名
  • ユーザーの管理者ID

この状況で、ユーザーの情報マネージャーの情報の両方を 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
于 2010-03-16T22:15:19.067 に答える
5

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
于 2010-03-16T22:17:13.820 に答える
4

テーブルがそれ自体を参照する機能がなければ、階層内のレイヤーの数と同じ数の階層レベルのテーブルを作成する必要があります。しかし、その機能が利用可能であるため、テーブルをそれ自体に結合すると、SQL はそれを 2 つの別個のテーブルとして扱うため、すべてが 1 か所に適切に格納されます。

于 2010-03-16T22:25:05.103 に答える
4

テーブルが自己参照型である場合に役立ちます。たとえば、ページのテーブルの場合、各ページにはnextandpreviousリンクがあります。これらは、同じテーブル内の他のページの ID になります。ある時点で、連続したページのトリプルを取得したい場合は、同じテーブルの列を使用してnextおよび列で 2 つの自己結合を実行します。previousid

于 2010-03-16T22:16:03.150 に答える
3

ここには多くの正解がありますが、同じように正しいバリエーションがあります。結合条件は、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
于 2013-03-27T17:18:29.247 に答える
1

自己結合は、テーブルのデータをそれ自体で評価する必要がある場合に役立ちます。つまり、同じテーブルの行を関連付けます。

Syntax: SELECT * FROM TABLE t1, TABLE t2 WHERE t1.columnName = t2.columnName

たとえば、初期指定が現在の指定と等しい従業員の名前を検索したいとします。次の方法で自己結合を使用してこれを解決できます。

SELECT NAME FROM Employee e1, Employee e2 WHERE e1.intialDesignationId = e2.currentDesignationId
于 2019-01-21T15:41:20.713 に答える
1

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
于 2017-02-14T21:01:51.207 に答える
0

これは、リンクされたリスト/ツリーに相当するデータベースであり、行には別の行への参照がある程度含まれています。

于 2010-03-16T22:20:12.640 に答える
-4

これは、一般的な用語での自己結合の説明です。自己結合は別のタイプの結合ではありません。他のタイプの結合 (内部結合、外部結合、およびクロス結合) を理解していれば、自己結合は簡単です。INNER、OUTER、および CROSS JOINS では、2 つ以上の異なるテーブルを結合します。ただし、自己結合では、同じテーブルをそのレフで結合します。ここでは、2 つの異なるテーブルはありませんが、テーブル エイリアスを使用して同じテーブルを別のテーブルとして扱います。それでもわからない場合は、次の YouTube ビデオをご覧になることをお勧めします。

自己結合の例

于 2012-08-31T13:25:03.050 に答える