皆さんはSQL Serverで複数のSELECT結果の差(差集合)を取得する際にどのようにしていますか?
Oracle SQLではMINUS演算子という便利なものが存在しますが、SQL ServerにMINUS演算子は存在しません。
そこで今回はこのMINUS演算子について、SQL Serverではどのような方法で同じ作用を作り出せばよいかについて解説してみたいと思います。
結果から言うと意外にも簡単な方法が存在するので、最後まで読んでみてください。
MINUS演算子とは
MINUS演算子はOracle SQLに存在する演算子です。
このMINUS演算子を使用することで、左側テーブルと右側テーブル比較し、左側テーブルにのみ存在するレコードを抽出することが出来ます。
SQL ServerにおけるMINUS演算子の代替
SQL ServerにはMINUS演算子というものはありません。
確認のためにサンプルコードを見てみましょう。
INSERT INTO tb_1(val) VALUES(1) INSERT INTO tb_1(val) VALUES(2) INSERT INTO tb_1(val) VALUES(3) INSERT INTO tb_2(val) VALUES(1) INSERT INTO tb_2(val) VALUES(3) SELECT * FROM tb_1 MINUS SELECT * FROM tb_2 val ----------- 1 2 3 (3 行処理されました) val ----------- 1 3 (2 行処理されました)
上記コードはOracle SQLでは正常に動作するコードとなっていますが、SQL Serverでは期待通りの結果が得られません。
SQL Serverではエラーこそ発生していませんが、これでSQL ServerではMINUS演算子が機能していないことが確認できました。
SQLServerではEXCEPT演算子を使う
ではSQL Serverではどのようにして同じような結果を得るかについて解説してみたいと思います。
SQL Serverではこれと同じ作用となる演算子に「EXCEPT」というものがあります。
このEXCEPT演算子を使用すれば、Oracle SQLのMINUS演算子と同じ結果を得られます。
記述方法についてもOracle SQLのMINUSと全く同じとなっているため、特に間違えることもないでしょう。
SELECT [column_name], [column_name], [column_name]... FROM [table_name] EXCEPT SELECT [column_name], [column_name], [column_name]... FROM [table_name]
では実際に先ほどのコードを使って結果を見てみましょう。
INSERT INTO tb_1(val) VALUES(1) INSERT INTO tb_1(val) VALUES(2) INSERT INTO tb_1(val) VALUES(3) INSERT INTO tb_2(val) VALUES(1) INSERT INTO tb_2(val) VALUES(3) SELECT * FROM tb_1 EXCEPT SELECT * FROM tb_2 val ----------- 2 (1 行処理されました)
今回は、先ほど「MINUS」だった演算子を「EXCEPT」というSQL Serverで使用できる演算子に変更しました。
実行結果では、期待通りの結果がきちんと表示されていることが確認できます。
まとめ
いかがでしたか?
今回はMINUS演算子の代わりでもある「EXCEPT演算子」について解説してみました。
SQLといってもDBMSにはいくつかの種別があり、それによって使える関数や演算子は若干変わってくることがあります。
インターネットで調べて「SQL」と表記されていても使えないといった場合には、こういった部分を確認してみると答えが出てきますので、調べ方も工夫してみましょう。