概要 :このチュートリアルでは、テーブルをそれ自体に結合できる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.lastnamee1およびe2同じ名前と名前の従業員がいないことを前提として、同じ従業員ではありません。
このチュートリアルでは、SQLite自己結合手法を使用してテーブルをそれ自体に結合する方法を示しました。