Postgres 差を出すSQL EXCEPT ALL 一方には含まれ、一方には含ま れていない

PostgreSQL

本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^

2つのSQLを利用して出した結果、同じ行数がでるはずなのに微妙な差が出る場合、何の差が出ているんだろうと悩む事があります。検証のために別のSQLを作って出してみたら、微妙に違うなんてこともあったりして。

この時に素早く、その差を結果として出力するためのSQLです。SQLの結果を結合するのはUNIONというSQL文がありますが、その逆、SQLの結果の差だけを表示します。

EXCEPT [ALL]

ALL:重複行も出力する

使い方

SELECT col1,col2 FROM table1
EXCEPT ALL
SELECT col1,col2 FROM table2

こうする事で、どこが違うんだろうと悩んだら、一発でその差を出すことができ、原因究明に役立ちます。

Oracleだとminusってあるみたいですけど、PostgreSQLではExceptで行きましょう。

Exceptデータがない行

使い方

SELECT col1,col2 FROM table1 
EXCEPT ALL 
SELECT col1,col2 FROM table2

table1が元になり、table2に含まれていない行が戻ります。あくまでもtable1の値が元になり返ってくる値はtable1のレコードです。

この逆でtable2のみに含まれている行は戻りません。

Exceptデータに差がある行

使い方

SELECT col1,col2 FROM table1 
EXCEPT ALL 
SELECT col1,col2 FROM table2

table1と、table2のカラムの差がある行を、table1の値で返します。

table2の値に更新をかけたい

table1:履歴ーある時点の作業状況を表す

table2:最新状態を表す

という仮定の元、table2の状態に向けて作業をし、table1を更新する手順を考えてみたいと思います。

状態1

  • 最新の状態と比べ作業がまだされていないレコードが返る
  • 最新の状態と比べ削除されていないレコードが返る
SELECT col1,col2 FROM table1 
EXCEPT 
SELECT col1,col2 FROM table2

状態2

  • 作業履歴と比較し、次に作業しなければいけないレコードが返る
  • 作業履歴と比較し、追加しないといけないレコードが返る
SELECT col1,col2 FROM table2 
EXCEPT
SELECT col1,col2 FROM table1

作業手順

  1. 状態1と状態2をデータテーブルに格納する
  2. 状態1に伴うものを削除(作業)し、レコードを削除する
  3. 状態2のレコードに伴って追加(作業)し、レコードを追加する

単純な手順で、最新の状態に変更をかける事が可能になります。

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