本ページは広告が含まれています。気になる広告をクリック頂けますと、サーバ運営費になります(^^
あれ、同じ結果のはずなのになんか違う
2つのSQLを利用して出した結果、同じ行数がでるはずなのに微妙な差が出る場合、何の差が出ているんだろうと悩む事があります。検証のために別のSQLを作って出してみたら、微妙に違うなんてこともあったりして。
この時に素早く、その差を結果として出力するためのSQLです。SQLの結果を結合するのはUNIONというSQL文がありますが、その逆、SQLの結果の差だけを表示します。
EXCEPTでいけます
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と状態2をデータテーブルに格納する
- 状態1に伴うものを削除(作業)し、レコードを削除する
- 状態2のレコードに伴って追加(作業)し、レコードを追加する
単純な手順で、最新の状態に変更をかける事が可能になります。