右結合(RIGHT JOIN)とは、右外部結合を示します。このステートメントを使用すると、右テーブルのすべての行を返しますが、左テーブルでマッチしない行は含まれません。
背景
外部結合(OUTER JOIN)は、比較演算子を使用して2つのテーブルのデータを比較します。結合結果には結合条件に合致する行だけでなく、条件に合致しない行も含まれます。
外部結合には、完全結合(FULL JOIN)、左結合(LEFT JOIN)、右結合(RIGHT JOIN)が含まれます。外部結合は結合条件を満たすすべての行を返し、一方のテーブルから未使用の行を返すと、もう一方のテーブルの対応する位置にNULLを入力します。
本記事では主に右結合の例を説明します。完全結合に関連する例については、完全結合 を、左結合に関連する例については 左結合を参照してください。
RIGHT JOIN構文
外部結合ステートメントには通常、左テーブルと右テーブルが含まれます。JOIN 句の最も左側に記述されているテーブルが左テーブル、JOIN 句の最も右側に記述されているテーブルが右テーブルです。
RIGHT JOINの構文は以下のとおりです:
SELECT select_list FROM table_name1 RIGHT JOIN table_name2 ON join_condition
[ WHERE query_condition ]
[ ORDER BY column_list ];
ここで、table_name1 が左テーブル、table_name2 が右テーブルです。
例
サンプルテーブルを作成し、適切なデータを挿入します。
obclient [SYS]> CREATE TABLE tbl_a(id NUMBER NOT NULL PRIMARY KEY, name VARCHAR2(50));
Query OK, 0 rows affected
obclient [SYS]> CREATE TABLE tbl_b(num NUMBER NOT NULL PRIMARY KEY, value NUMBER);
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO tbl_a VALUES(1,'ab'),(2,'cd'),(3,'ef'),(4,'gh');
Query OK, 6 rows affected
Records: 6 Duplicates: 0 Warnings: 0
obclient [SYS]> INSERT INTO tbl_b VALUES(1,1001),(3,1003),(5,1005);
Query OK, 4 rows affected
Records: 4 Duplicates: 0 Warnings: 0
シンプルな右結合クエリ
JOIN が返すデータが結合条件やフィルター条件にマッチするデータのほか、右テーブルのフィルター条件にはマッチするものの結合条件を満たさないデータも含まれる場合、右結合を使用できます。右結合で返される結果において、左テーブルに属するデータが存在しない場合、その列は NULL を返します。
例1:テーブル tbl_a とテーブル tbl_b に対して右結合クエリを実行し、実行結果を取得します。
obclient [SYS]> SELECT * FROM tbl_a;
+----+------+
| ID | NAME |
+----+------+
| 1 | ab |
| 2 | cd |
| 3 | ef |
| 4 | gh |
+----+------+
4 rows in set
obclient [SYS]> SELECT * FROM tbl_b;
+-----+-------+
| NUM | VALUE |
+-----+-------+
| 1 | 1001 |
| 3 | 1003 |
| 5 | 1005 |
+-----+-------+
3 rows in set
obclient> SELECT tbl_a.id, tbl_a.name, tbl_b.num, tbl_b.value FROM tbl_a RIGHT JOIN tbl_b ON tbl_a.id=tbl_b.num;
+------+------+--------+-------+
| ID | NAME | NUM | VALUE |
+------+------+--------+-------+
| 1 | ab | 1 | 1001 |
| 3 | ef | 3 | 1003 |
| NULL | NULL | 5 | 1005 |
+------+------+--------+-------+
3 rows in set
右結合WHERE句による結合結果のフィルタリング
右結合を使用して結合結果を取得し、次に WHERE 句を使用して結合結果をフィルタリングできます。
例2:テーブル tbl_a とテーブル tbl_b に対して右結合クエリを実行した後、tbl_b テーブルの value=1003 のデータを返します。
obclient> SELECT t1.id, t1.name, t2.id, t2.name FROM t1
LEFT JOIN t2 ON t1.id=t2.id WHERE t1.id IS NOT NULL;
+----+------+----+------+
| ID | NAME | ID | NAME |
+----+------+----+------+
| 1 | A1 | 1 | B2 |
| 2 | B1 | NULL | NULL |
| 4 | D1 | NULL | NULL |
| 6 | F1 | 6 | F2 |
| 8 | H1 | NULL | NULL |
| 10 | J1 | NULL | NULL |
+----+------+----+------+
6 rows in set