SQLだけでテーブル内容の一致判定をする

同じ定義のテーブルが2つあり、 その全行が同じかどうか(違う行がないか)を確かめたいときの方法。

select count(*) from (
  (select * from x except select * from y)
  union all
  (select * from x except select * from y)
)

結果が 0 なら内容は同じです。1 以上なら何かしら異なる。

ちなみに遅いです。あくまでも行数が少ないとき向け(100万行くらいまでか)。 高速にしたいならテーブルごとにユニークキーを考えてSQL書くしかないですね。

Redshiftはビューの参照先テーブルをrenameすると追跡する

またタイトルだけで言いたいこと終わった…

=> create table t (x int);
CREATE TABLE

=> insert into t values (777);
INSERT 0 1

=> create view v as select * from t;
CREATE VIEW

=> alter table t rename to t2;
ALTER TABLE

=> select * from v;
  x  
-----
 777
(1 row)

この仕様、便利なようで超不便……。 drop - create で作り直す方法とめっちゃ相性悪い。