SQLiteリファレンス
当サイトはSQLiteに関するSQL文やコマンドのリファレンスサイトです。
HOME > Sから始まるSQL文・コマンド

self join句

複数のテーブルを自己結合して表示するSQL文

複数のテーブルを自己結合して表示する方法

複数のテーブルを自己結合させるには、inner (left outer ) join句で指定するテーブルを同一の物にします。

自己結合とは、同じテーブルを結合させていくことです。

自己結合の書き方

select カラム名 from テーブルA inner join テーブルA on 結合条件 where 抽出条件
select カラム名 from テーブルA left outer join テーブルA on 結合条件 where 抽出条件

テーブルの結合はfor文が入れ子になっていると考えると良いです。自己結合も同じです。

自己結合の使い方

idとタイトルと親idを持つテーブルpostを作成しています。

PHPのPDOを使用した例

SQL
<?php
$pdo = new PDO("sqlite:./test.sqlite3");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_ASSOC);
$pdo->setAttribute(PDO::ATTR_TIMEOUT,5);

$pdo->exec("create table post ( id integer , title text , parent_id integer )");
$pdo->exec("insert into post values( 1,'おはよう',0)");
$pdo->exec("insert into post values( 2,'おはよう2',1)");

$stmt = $pdo->query("select p1.id as p1_id , p1.title as p1_title , p2.id, p2.title from post as p1 
 inner join post as p2 on p1.id = p2.parent_id");
$result = $stmt->fetchAll();
echo "<pre>";
print_r($result);
echo "</pre>";
?>

SQLiteのGUIツールを使用した例

SQL
C:sq>sqlite3 test.sqlite3
sqlite> .headers on
sqlite> .mode column
sqlite> create table post ( id integer , title text , parent_id integer );
sqlite> insert into post values( 1,'おはよう',0);
sqlite> insert into post values( 2,'おはよう2',1);
sqlite> select p1.id as p1_id , p1.title as p1_title , p2.id, p2.title from post as p1 
 inner join post as p2 on p1.id = p2.parent_id;