(Oracle) DISTINCT でselect結果から重複を無くす

(Oracle) DISTINCT でselect結果から重複を無くす

 

本記事では、
selectによる検索結果から重複を除去するDISTINCTの使い方を解説する。

DISTINCTによる重複削除は、
COUNTなどの他のselect部分で使える構文と合わせて使用することもでき
場合によってはとても役に立つ構文なので使い方をしっかり押さえておこう。

 

DISTINCTの使い方

DISTINCTを使うと、
SQLのSelectの結果から重複を除去することが可能だ。

 

DISTINCTの基本的な使い方① –単一カラムの重複除去–

以下はDISTINCTを使って、動物名の重複を除去するサンプル。
DINSTINCTの最も基本的な使い方だ。

--テーブル1の件数を取得する
SELECT
   DISTINCT 動物
FROM
   テーブル1;

--テーブル1
+------+
| 動物 |
+------+
|  かめ | 
|  いぬ | 
|  うし | 
|  うし | 
|  たぬき | 
|  たぬき | 
|  たぬき | 
+------+
--実行結果
+-------+
| 動物  |
+------+
|  かめ |
|  いぬ |
|  うし |
| たぬき |
+------+

 

「うし」「たぬき」はそれぞれレコードとして重複が存在するが、SELECT時にDISTINCTを使用しているため、結果として重複が除去され、純粋な動物名の種類だけが抽出された結果となった。

 

DISTINCTの基本的な使い方② –複数カラムでの重複除去–

以下はDISTINCTを使って、動物名の重複と年齢の複数カラムから重複を除去するサンプル。
DISTINCTは複数カラムに対しても指定することができ、より柔軟な重複除去が可能である。

--テーブル1の件数を取得する
SELECT
   DISTINCT 動物, 年齢
FROM
   テーブル1;

--テーブル1
+------+------+
|  動物 |  年齢 |
+------+------+
|   かめ | 100 |
|   いぬ |   1 | 
|   うし |   5 |
|   うし |   5 |
|  たぬき | 13 | 
|  たぬき | 13 |  
|  たぬき | 88 | 
+------+------+
--実行結果
+------+------+
|  動物 |  年齢 |
+------+------+
|   かめ | 100 |
|   いぬ |   1 | 
|   うし |   5 |
|  たぬき | 13 |   --★ 複数DISTINCTで残ったレコード
|  たぬき | 88 |   --★ 複数DISTINCTで残ったレコード
+------+------+

「たぬき」のレコードのうち、年齢のカラムには、13と88のレコードが存在する。

DISTINCTでは「動物」「年齢」の両方を指定したため、重複行として判断できる最小の、
「たぬき、13」の組み合わせと、「たぬき、88」の組み合わせに分類された結果となった。

この様に、ちょっととっつきづらいかもしれないが、DISTINCTでは複数カラム指定の重複削除も実行できることを覚えておくとより便利な使い方が可能となる。

 

(おまけ)COUNTと合わせて使うDISTINCT

最後にCOUNTと合わせて使うDISTINCTの使い方を紹介する。

--テーブル1の件数を取得する
SELECT
COUNT(distinct 動物) AS 動物数
FROM テーブル1;


--テーブル1
+------+
| 動物 |
+------+
|  かめ | 
|  いぬ | 
|  うし | 
|  うし | 
|  たぬき | 
|  たぬき | 
|  たぬき | 
+------+
--実行結果
+------+
| 動物数 |
+------+
| 4     | 
+------+

 

COUNT関数を使って動物の種類の数を抽出する際、
DISTINCTを使って、動物の種類の重複をなくしているのが分かるだろう。

この様に、DISTINCTは他の関数と組み合わせて使うことでより便利に使用することが可能である。

 

関連記事

(Oracle) DECODEで条件を分ける【CASEとの違いも解説】
(Oracle) CASEで条件を分ける【DECODEとの違いも解説】
(Oracle) COUNT でレコード件数を取得する方法

https://www.shift-the-oracle.com/sql/distinct.html

https://docs.oracle.com/cd/E17952_01/mysql-8.0-ja/distinct-optimization.html

 

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。