概要 :このチュートリアルでは、テーブルをそれ自体に結合できるSQLite自己結合と呼ばれる特殊なタイプの結合について学習します。
INNER JOIN
に精通している必要があることに注意してください およびLEFT JOIN
このチュートリアルを進める前に、条項を使用してください。
SQLite自己結合の概要
自己結合は、LEFT JOIN
のいずれかを使用してテーブルをそれ自体に結合できるようにする特別な種類の結合です。 またはINNER JOIN
句。自己結合を使用して、同じテーブル内の他の行と行を結合する結果セットを作成します。
クエリで同じテーブルを複数参照することはできないため、自己結合を使用する場合は、テーブルエイリアスを使用してテーブルに別の名前を割り当てる必要があります。
自己結合は、同じテーブル内の同じ列または異なる列の値を比較します。自己結合に関与するテーブルは1つだけです。
多くの場合、自己結合を使用して、テーブルに格納されている親子関係を照会したり、現在の合計を取得したりします。
SQLiteの自己結合の例
employees
を使用します デモンストレーション用のサンプルデータベースのテーブル。
employees
テーブルには、従業員データだけでなく組織データも格納されます。 ReportsTo
列は、従業員間のレポート関係を指定します。
従業員がマネージャーに報告する場合、ReportsTo
の値 従業員の行の列は、EmployeeId
の値と同じです マネージャーの行の列。従業員が誰にも報告しない場合は、ReportsTo
列はNULL
です 。
誰が誰の直属の部下であるかに関する情報を入手するには、次のステートメントを使用します。
SELECT m.firstname || ' ' || m.lastname AS 'Manager',
e.firstname || ' ' || e.lastname AS 'Direct report'
FROM employees e
INNER JOIN employees m ON m.employeeid = e.reportsto
ORDER BY manager;
Code language: SQL (Structured Query Language) (sql)
試してみてください
ステートメントはINNER JOIN
を使用しました employees
に参加する条項 それ自体に。 employees
テーブルには、従業員とマネージャーの2つの役割があります。
INNER JOIN
を使用したため employees
に参加する条項 テーブル自体の場合、結果セットには、マネージャー列にNULL
が含まれる行がありません。 値。
連結演算子||
に注意してください 複数の文字列を1つの文字列に連結します。この例では、連結演算子を使用して、名、スペース、および姓を連結することにより、従業員のフルネームを取得します。
誰にも報告しないCEOに問い合わせる場合は、INNER JOIN
を変更する必要があります。 LEFT JOIN
の句 上記のクエリの句。
Andrew Adams
誰も報告していないので、CEOです。
自己参加手法を使用して、次のクエリと同じ都市にいる従業員を見つけることができます。
SELECT DISTINCT
e1.city,
e1.firstName || ' ' || e1.lastname AS fullname
FROM
employees e1
INNER JOIN employees e2 ON e2.city = e1.city
AND (e1.firstname <> e2.firstname AND e1.lastname <> e2.lastname)
ORDER BY
e1.city;
Code language: SQL (Structured Query Language) (sql)
試してみてください
結合条件には2つの式があります:
-
e1.city = e2.city
両方の従業員が同じ都市にいることを確認するため -
e.firstname <> e2.firstname AND e1.lastname <> e2.lastname
e1
およびe2
同じ名前と名前の従業員がいないことを前提として、同じ従業員ではありません。
このチュートリアルでは、SQLite自己結合手法を使用してテーブルをそれ自体に結合する方法を示しました。