【SQL】UNION ALLで結合後にWHEREで検索条件を設定する

PostgreSQL
スポンサーリンク

テーブルを結合後に検索条件を設定したい!と思うことがありました。

DBのテーブル2つを結合する際にWHEREで検索条件を設定することで、任意のレコードを抽出できます。

ちなみに、動作はPostgreSQLで試しました。

テーブルを2つ準備

SELECT * FROM book1;

 id |   name    
----+-----------
  1 | 面白い本1
  2 | 面白い本2
  3 | 面白い本3
(3 rows)

SELECT * FROM book2;

 id |  name   
----+---------
  1 | 良い本1
  2 | 良い本2
  3 | 良い本3
(3 rows)

book1とbook2というテーブルに、それぞれ3レコード分のデータを入れました。
カラムはidとnameしかない簡単なものにしました。

まずは2つのテーブルを結合

SELECT * FROM book1 
UNION ALL
SELECT * FROM book2;

 id |   name    
----+-----------
  1 | 面白い本1
  2 | 面白い本2
  3 | 面白い本3
  1 | 良い本1
  2 | 良い本2
  3 | 良い本3
(6 rows)

UNION ALLでテーブルを結合できます。重複したレコードを削除する場合はUNIONを使用します。

テーブルを結合後に検索条件を設定

SELECT * FROM 
( SELECT * FROM book1 UNION ALL SELECT * FROM book2 ) AS book
WHERE id=1;

 id |   name    
----+-----------
  1 | 面白い本1
  1 | 良い本1
(2 rows)

先ほどUNION ALLで結合したレコードにASでbookという名前をつけ、WHERE条件を設定してからSELECTします。ASで名前をつけないと、失敗します。

ちなみにそれぞれ検索条件を設定する場合

SELECT * FROM book1 WHERE id=1
UNION ALL
SELECT * FROM book2 WHERE id=2;

 id |   name    
----+-----------
  1 | 面白い本1
  2 | 良い本2
(2 rows)

それぞれのテーブルで検索条件をつけてSELECTする場合は、どちらにもWHEREを設定します。
テーブルごとに異なる条件で検索したい時などに使えます。

コメント

タイトルとURLをコピーしました