0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

MySQLで3つ以上のテーブルを完全外部結合する方法

Last updated at Posted at 2024-02-10

はじめに

MySQL(8.0)では完全外部結合(FULL OUTER JOIN)が使えません。そこでJOIN句とUNION句を使って完全外部結合の結果を返します。他の記事だと2テーブルに対しては方法がすでに紹介されているので本記事では3テーブル以上の場合はどうするかを紹介します。

2テーブルの場合

数学のテストを受けた学生と点数のテーブル(math)と英語のテストを受けた学生と点数のテーブル(english)を結合します。どちらかのテストのみ受けた人も表示したい場合はstudentカラムをキーとした完全外部結合を行います。

image.png

2テーブルの完全外部結合は以下の考え方で行います。
1. 2つのテーブルに左外部結合(LEFT OUTER JOIN)
2. 2つのテーブルの右外部結合(RIGHT OUTER JOIN)
3. 2回結合した結果に対して和集合をとる(UNION)

よってmathテーブルとenglishテーブルは次のSQLで結合できます。

SELECT
    math.student,
    math.math_score,
    english.english_score
FROM
    math
LEFT OUTER JOIN
    english ON math.student = english.student
UNION
SELECT
    english.student,
    math.math_score,
    english.english_score
FROM
    math
RIGHT OUTER JOIN 
    english ON math.student = english.student

image.png

3テーブルの場合

今度は先ほどのテーブルに国語(japanese)も加えて完全外部結合をします。
image.png

3テーブルの完全外部結合は以下の考え方で行います。
1. With句で2テーブルの完全外部結合の結果を保持
2. 保持した結果と3つ目のテーブルを完全外部結合

3テーブルの結合は次のようになります。

WITH temp AS(
    SELECT 
        math.student,
        math.math_score,
        english.english_score
    FROM
        math
    LEFT OUTER JOIN
        english ON math.student = english.student
    UNION
    SELECT 
        english.student,
        math.math_score,
        english.english_score
    FROM
        math
    RIGHT OUTER JOIN 
        english ON math.student = english.student
)

SELECT
    temp.student,
    temp.math_score,
    temp.english_score,
    japanese.japanese_score
FROM
    temp
LEFT OUTER JOIN 
    japanese ON temp.student = japanese.student
UNION
SELECT 
    japanese.student,
    temp.math_score,
    temp.english_score,
    japanese.japanese_score
FROM
    temp
RIGHT OUTER JOIN
    japanese ON temp.student = japanese.student

image.png

4テーブル以上の場合

3テーブルの考え方と同様に結合した結果をWith句で保持して2テーブルの結合を繰り返します。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?