※ この記事にはアフィリエイトリンクが含まれます
PostgreSQLでUNION ALL を使ってクエリを作成したとき、
- 同じデータが複数出力される
- 重複しているレコードを特定したい
といった場面に遭遇することがあります。
UNION ALL は複数のSELECT結果を結合するSQLですが、UNION とは違い重複データもそのまま結果に含まれるという特徴があります。
そのため、データ調査やデータ結合の処理では、
「どのデータが重複しているのか」
を確認する必要が出てくることがあります。
この記事では、PostgreSQLでUNION ALLした結果から重複データだけを抽出するSQLを解説します。
SQLでデータ調査をする際に役立つテクニックなので、ぜひ参考にしてください。
UNION ALLした結果から重複データを抽出する方法
UNION ALL した結果から重複データだけを抽出するには、GROUP BYとCOUNTを使います。
以下のSQLを見てみましょう。
SELECT name, COUNT(*)
FROM (
SELECT name FROM table_a
UNION ALL
SELECT name FROM table_b
) t
GROUP BY name
HAVING COUNT(*) > 1;このSQLでは次のような処理を行なっています。
UNION ALLでデータをまとめるGROUP BYで同じデータをグループ化するCOUNT(*)で出現回数を数えるHAVING COUNT(*) > 1で重複データのみ抽出する
つまり、2回以上出現しているデータだけを取得するSQLになっています。
実行結果のイメージ
次のようなテーブルがあったとします。
table_a
| name |
|---|
| Tanaka |
| Sato |
table_b
| name |
|---|
| Tanaka |
| Suzuki |
この2つのテーブルをUNION ALL すると、次のような結果になります。
| name |
|---|
| Tanaka |
| Sato |
| Tanaka |
| Suzuki |
この状態で先ほどのSQLを実行すると、次の結果になります。
| name | count |
|---|---|
| Tanaka | 2 |
このように、重複しているデータのみを抽出することができます。
重複しているレコードの中身を確認したい場合
重複しているキーが分かった後に、
- 実際のレコード内容を確認したい
- どのテーブルのデータが重複しているのか調査したい
といったケースもあると思います。
その場合は、次のようにWITH句(CTE)を使うと、分かりやすく書くことができます。
WITH union_data AS (
SELECT name FROM table_a
UNION ALL
SELECT name FROM table_b
)
SELECT *
FROM union_data
WHERE name IN (
SELECT name
FROM union_data
GROUP BY name
HAVING COUNT(*) > 1
);このSQLでは、
UNION ALLした結果をunion_dataとして定義- 重複しているキーを抽出
- そのキーに該当するレコードを取得
という流れになっています。
WITH句についての詳しい内容はこちらの記事が参考になります。

これにより、重複しているレコードの詳細を確認することができます。
まとめ
今回は、UNION ALLした結果から重複データを抽出する方法を紹介しました。
ポイントをまとめると次の通りです。
UNION ALLは重複データもそのまま出力されるGROUP BYとCOUNT(*)を使うことで重複データを抽出できるHAVING COUNT(*) > 1を使うと、重複しているデータのみ取得できる- レコードの詳細を確認する場合は
WITH句を使うと便利
データ調査やデータ品質の確認を行う際には、ぜひ活用してみてください。
PostgreSQLは、現場でも広く使われている信頼性の高いデータベースです。
もしこれから本格的に学び、実務で通用する力をつけたい方には、RareTECHをチェックしてみてください。
実案件ベースのカリキュラムで、あなたのスキルを次のステージへ引き上げてくれるはずです。

なんくる「本当にエンジニアとしてやっていけるか不安…」という方も、実践的な開発に関わることで、転職後の働き方を事前に体感できますよ。
実務で使えるDBスキルとともに、プログラミングスキルをちゃんと身につけたいなら、
RareTECHの無料カウンセリングで、学ぶ目的やゴールをプロと一緒に明確にしてみましょう。独学では得られない「実践的な成長の道筋」が見えてきます。


もしこの内容を通して、PostgreSQLについてさらに理解を深めたいと感じられたなら、信頼できる講座や書籍を紹介した別記事をご覧いただくのも良いかと思います。ご自身の学びに、きっとお役立ていただけるはずです。










コメント