自己結合をサンプルを使って分かりやすく解説!【postgresql】

同一のテーブルを対象に行う結合のことを「自己結合」と言います。

ただ、他のテーブルの結合として自分自身と結合するので混乱される方も多いのではないでしょうか?

今回は、以下の4つのサンプルを例に「自己結合」を紹介します!

  • 重複の順列
  • 順列
  • 組み合わせ
  • 重複の組み合わせ

ちなみに「順列」と「順列」は以下で解説します。

順列

いくつかのものを「順序をつけて列に並べる並べ方の総数」のことです。

赤・青・黒の3つのボールから2つ選んで並べると、

・「赤と青」

・「青と赤」

・「赤と黒」

・「黒と赤」

・「青と黒」

・「黒と青」

の6通りあります。

「赤と青」と「青と赤」は別のものとしてカウントするのがポイントです。

組み合わせ

要素の集まりからいくつかの要素を選び出すときの、「組み合わせの種類の総数」のことです。

赤・青・黒の3つのボールから2つ選ぶ場合の組み合わせは、

・「赤と青」

・「赤と黒」

・「青と黒」

の3通りになります。

サンプルとして使用するテーブル

サンプルで使用するテーブルのイメージです!

id名前
1Chrome
2safari
3Firefox
browserテーブル
create temp table browser (
  id integer unique,
  name varchar(10)
);

insert into browser values (1, 'Chrome');
insert into browser values (2, 'safari');
insert into browser values (3, 'Firefox');

重複ありの順列

こちらは単純に総当たりで、全てのレコードの組み合わせを列挙しているだけです。

なので、結合条件が存在しないクロス結合のみで表現できます。

ポイントは、自分自身を別のレコードと見做すこと

SELECT 
	B1.name as name_1, 
	B2.name as name_2
FROM browser B1
     CROSS JOIN browser B2;
name_1name_2
ChromeChrome
Chromesafari
ChromeFirefox
safariChrome
safarisafari
safariFirefox
FirefoxChrome
Firefoxsafari
FirefoxFirefox
browserテーブル(重複ありの順列)

順列

「重複ありの順列」から、同一要素の組み合わせを除外したのが順列です。

(「Chrome – Chrome」などを除外した)

INNER JOINで表現できます。

SELECT 
	B1.name as name_1, 
	B2.name as name_2
FROM browser B1
INNER JOIN browser B2 
	ON B1.name <> B2.name
name_1name_2
Chromesafari
ChromeFirefox
safariChrome
safariFirefox
FirefoxChrome
Firefoxsafari
browserテーブル(順列)

組み合わせ

これが一番使用率が高いと思います。

順列からさらに、「Chrome – safari」、「safari – Chrome」のような組み合わせも除外します。

こちらもINNER JOINで表現できます。

比較演算子である「>」が、文字列でも使えるのがポイントです。

「>」を「<」に変えたらどうなるか?ぜひ試してみてください。

SELECT 
	B1.name as name_1, 
	B2.name as name_2
FROM browser B1
INNER JOIN browser B2 
	ON B1.name > B2.name
name_1name_2
safariChrome
safariFirefox
Firefoxsafari
browserテーブル(組み合わせ)

重複ありの組み合わせ

組み合わせなので、「Chrome – safari」、「safari – Chrome」は除外します。

ただし、重複を許すので「Chrome – Chrome」のようなペアが表示されるようになります。

SELECT 
	B1.name as name_1, 
	B2.name as name_2
FROM browser B1
INNER JOIN browser B2 
	ON B1.name >= B2.name
name_1name_2
ChromeChrome
safariChrome
safarisafari
safariFirefox
FirefoxChrome
FirefoxFirefox
browserテーブル(重複ありの組み合わせ)

まとめ

まとめ

順列、組み合わせを「自己結合」で表現したサンプルを書きました!

自己結合は、複雑そうに感じますけど

エイリアスを使って別テーブルと見なせば

普段使っている、INNER JOINなどの結合と何も変わらないのが分かると思います!

是非、仕事で使ってみてください!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です