• ベストアンサー

集合演算子の実用例

中途でIT企業に入ったものです。 SQLを勉強していますが、UNIONやMINUSという集合演算子を 学習しています。 これは実際の開発業務では、どういったケース(業務の要件?)で 使用されるのでしょうか?。 例えばMINUSだと、「前月で売れたが今月は売れてない商品」を抽出する、 などのケースで使用するのでしょうか。 参考に教えて頂けると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

例1)単純に縦に出力したいときに使う。 select 課名,'予算' as 予実,nvl(予算金額,0) from 課マスタ left outer join 予算マスタ on 課マスタ.課コード = 予算マスタ.課コード union select 課名,'実績' as 予実,nvl(実績金額,0) from 課マスタ left outer join 実績マスタ on 課マスタ.課コード = 予算マスタ.課コード order by 課名,予実 とすると、 1課 予算 10000 1課 実績 8500 2課 予算 20000 2課 実績 0 ・・・ とでる。 例2)例1と違ってどちらか一方にしかないデータをどちらも出したいときに使う。 select 課名,sum(予算金額), sum(実績金額) from ( select 課名,予算金額 as 予算金額,0 as 実績金額 from 予算マスタ union select 課名,0 as 予算金額,実績金額 as 実績金額 from 実績マスタ ) group by 課名 order by 課名 とすると 1課 10000 8500 2課 20000 0   ←実績マスタなし 3課 0 8500 ←予算マスタなし とでる。 例3)今年新規(過去3年間取引のなかった取引先も新規として扱う)で獲得した取引先の数 select count(*) from ( select distinct 取引先コード from 売上マスタ where 年度 = 2012 minus select distinct 取引先コード from 売上マスタ where 年度 = 2011 minus select distinct 取引先コード from 売上マスタ where 年度 = 2010 minus select distinct 取引先コード from 売上マスタ where 年度 = 2009 ) 例4)(これはどっちかというとシステム保守要件ですが。) 何らかの異常があったときに不整合データのチェックに使う select * from Aマスタ_バックアップ minus select * from Aマスタ Aマスタ_バックアップにあってAマスタにないものが出てくるので、 これらを調べたりする。 select * from Aマスタ minus select * from Aマスタ_バックアップ 逆のパターンのデータ。これも調べる。 とか。 例5)Orの代わりにunionを使うと便利なこともたまにある。 select * from table1 where Key1 between 1 and 3 union select * from table1 where Key1 between 6 and 7 union select * from table1 where Key1 between 12 and 18 select * from table1 where Key1 between 1 and 3 or Key1 between 6 and 7 or Key1 between 12 and 18 と書けばしまいなのだが、orを使うとインデックスを使ってくれないことがあるので、 orを使わないselectをunionしたほうが早いことがたまにある。 ★table1が、5000万件あるときなどあくまで例外的な使い方です。 !!!普通は、orを使ったほうがいいです!!! ## SQLはこんな感じだったと思うというレベルで書いています。(うまく動かないかも) ## とりあえず、過去に使った例ですぐに思いついたパターンを挙げてみました。

noname#185813
質問者

お礼

皆様有難うございました、大変参考になりました。

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

下記のページが参考になるかと。 http://codezine.jp/article/detail/1304 なお、標準SQLで MINUS に該当するのは EXCEPT になります。

関連するQ&A