限定しりとり

中途でIT企業に入ったものです。

SQLを勉強していますが、UNIONやMINUSという集合演算子を
学習しています。

これは実際の開発業務では、どういったケース(業務の要件?)で
使用されるのでしょうか?。

例えばMINUSだと、「前月で売れたが今月は売れてない商品」を抽出する、
などのケースで使用するのでしょうか。

参考に教えて頂けると助かります。

A 回答 (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はこんな感じだったと思うというレベルで書いています。(うまく動かないかも)
## とりあえず、過去に使った例ですぐに思いついたパターンを挙げてみました。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/09/14 01:37

下記のページが参考になるかと。


http://codezine.jp/article/detail/1304

なお、標準SQLで MINUS に該当するのは EXCEPT になります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す