sql >> データベース >  >> RDS >> Database

SQL自己結合

    この記事では、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        |
    +-----------------+------------------+

    1. GreenDaofreemaker.jarがありません

    2. 外部からDockerコンテナでPostgresqlに接続する

    3. OracleでBLOBからファイルを取得する方法は?

    4. PostgreSQLの機能はトランザクションですか?