4
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?

はじめに

以前社内のSQL勉強会のネタ探しでJOINの話中にFULL JOINの話をしたところ、
同チームの人がFULL JOIN・・・?
というリアクションだったので調べてみたところ、MySQLにはFULL JOINがないとのこと

今の会社に入る前はMySQLではなかったのでjoinの中にFULL JOINなるものがある(いつ使うかはいまだによくわからんけど)のは知ってたのでほえ~ってなりました

FULL JOINとは

完全外部結合ともいいます。
LEFT JOINだと左側のテーブルを基準として右側のテーブルに一致するものがなくてもNULLとして結合し、表示します。
RIGTHT JOINだとその逆で右側のテーブルを基準とします。
FULL JOINでは両方のデータを正として、左にしかないデータも右にしかないデータも表示してくれるわけです。

いつか使うかもしれないので備忘として

Customersテーブル

CustomerID CustomerName
1 Alice
2 Bob
3 Charlie

Ordersテーブル

OrderID CustomerID ProductName
101 1 ProductA
102 2 ProductB
103 3 ProductC
104 4 ProductD
FULL JOINもどき
SELECT COALESCE(C.CustomerID, O.CustomerID) AS CustomerID,
       C.CustomerName,
       O.OrderID,
       O.ProductName
FROM Customers C
LEFT JOIN Orders O ON C.CustomerID = O.CustomerID

UNION

SELECT COALESCE(C.CustomerID, O.CustomerID) AS CustomerID,
       C.CustomerName,
       O.OrderID,
       O.ProductName
FROM Orders O
LEFT JOIN Customers C ON C.CustomerID = O.CustomerID
WHERE C.CustomerID IS NULL;

実行結果

CustomerID CustomerName OrderID ProductName
1 Alice 101 ProductA
2 Bob 102 ProductB
3 Charlie 103 ProductC
4 NULL 104 ProductD

メモと解説のようなもの

MySQLにはそもそもFULL JOINがないと初めに言った通りで、実施するには外部結合結果をUNION結合する、といった力業が必要になります。

UNIONより上のクエリでCustomersを正とした外部結合を行い、UNIONより下でOrdersを正とした結合を行い、UNIONで結合することにより、UNIONが持つ重複削除の恩恵を受けて二つの外部結合結果のいいとこどりができるというわけです。

うーんまじでFULL JOINっていつ使うんや?

4
0
0

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
4
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?