ray88’s diary

お仕事で困ったとき用の自分用の覚書

SQL指南書 重複順列・順列・組み合わせ(自己結合)

SQL 指南書集 目次 - ray88’s diary
■以下のテーブルよりそれぞれ重複順列・順列・組み合わせを作成する

【重複順列を作成】
重複順列 - 数学ノート

/* 重複順列を得るSQL(p.29) */
SELECT
	P1.name AS name_1
	,P2.name AS name_2
FROM products P1,products P2;

3×3×3=9 通りの組み合わせが出力された

【順列を作成】
※「WHERE p1.name <> p2.name」によって同一の組み合わせを排除
異なるn個のものからr個取り出して一列に並べるときの場合の数 - 数学ノート

/* 順列を得るSQL(p.30) */
SELECT
	P1.name AS name_1
	,P2.name AS name_2
FROM products P1,products P2
WHERE p1.name <> p2.name;

_3P_3=3!=3×2×1=6通りの組み合わせが出力された

【組み合わせ①】
不当記号の条件で各アイテムについて「文字コードの順にソートして自分より(ここでは)前の来る」商品だけをペアの相手に選ぶようにする。
文字コード順:みかん<りんご<バナナ 
(バナナはカタカナなので文字コード上、一番うしろとなる)
※実行前に文字コードの順を以下SQLで確認

SELECT * FROM products
ORDER BY name ASC;

/* 組み合わせを得るSQL(p.31) */
SELECT 
	P1.name AS name_1
	, P2.name AS name_2
FROM Products P1, Products P2
WHERE 
	P1.name > P2.name;

みかん<りんご<バナナ
_{3}C_2=3

【組み合わせ②】
3つ以上の組み合わせを得たいときも、次のように簡単に拡張できる。
_{3}C_3=3

/* 組み合わせを得るSQL:3列への拡張(p.31) */
SELECT 
	P1.name AS name_1
	,P2.name AS name_2
	,P3.name AS name_3
FROM Products P1, Products P2, Products P3
WHERE 
	P1.name > P2.name
	AND
	P2.name > P3.name;

みかん<りんご<バナナ