[三流君] −−>
[ASPで遊ぶ、失敗する] −−>
[バックナンバー一覧]
−−> No.104 ADO SQL文のNOT EXISTS 句で集合の差を求める
ADO SQL文のNOT EXISTS 句で集合の差を求める
本文(発行内容)
ADO SQL文のNOT EXISTS 句で集合の差を求める
こんにちは、三流プログラマーのKen3です。
今回は、
私も初めて使うSQL文のNOT EXISTS 句です。
いつもの三流的なアプローチなので、実際はアレンジして使ってください。
※一部でも参考になればいいんだけど・・・
/*
* 1.今回のキッカケ
*/
>テーブル AとBがあります。A,Bともに 伝票aA伝票行、商品名で構成
>されています。
>
>質問ですが、Bの抽出条件は、Aのbニ同じBの伝票bナ、Aの伝票行と違う
>データだけを抽出したいのですが..。
>
と、質問をもらった。
/*
* 2.テーブルをつなげるのはUnionだったけど・・・
*/
同じ構造のテーブルかぁ、よく目にする耳にするのは、
Unionって言葉かな、でも、これは、つなげるだけだしね。
SQL UNIONでつなげ複数テーブルを読み込む
http://www.ken3.org/cgi-bin/test/test100-2.asp
で、3つのテーブルをつなげてたっけ。
UNION と UNION ALL が微妙に違ってたり
SQL UNION ALLでつなげ複数テーブルを読み込む
http://www.ken3.org/cgi-bin/test/test100-3.asp
で、ALLでつなげると同じデータ(重複)を弾かなかったり。
だから、今回はつなげて一緒にする話じゃないだろ、
横道にそれてスミマセン、いつものクセで・・・
/*
* 3.UNION 真逆の差を求めたいんです Minus発見
*/
やりたいことは、UNIONの逆、差を求めたいんですよね。
そんな便利な集合演算できるのか?と思い、
SQL SELECT 差
上記の3つのキーワードで検索すると、
Minus なんて素敵な女性じゃなかったキーワードを見つける・・・
さっそくテストしてみますか。
テストデータは手抜きでNo100で使ってた、
DB:db100.mdb
Select * From T_2002年売上
商品CD 売上金額
A001 100
B002 50
A001 20
CCCC 1200
Select * From T_2003年売上
商品CD 売上金額
A001 100
CCCC 500
の2つを使って、
T_2003年売上 テーブル
から
T_2002年売上 テーブルにあるA001 100を取り除いた結果を求めたいと思います。
得意になって、
Minus 演算子でつなげ、複数テーブルをSelectしてみました
Select * From T_2003年売上
Minus
Select * From T_2002年売上
↑こんなSQLを書くと・・・
Microsoft JET Database Engine エラー '80040e14'
FROM 句の構文エラーです。
/cgi-bin/test/test104-1.asp, 行 31
あらら、、、何でだろ。。。
/*
* 4.MinusはMS SQLServerに無し、EXISTS 句と NOT EXISTS 句を使え?
*/
アタックに失敗して、気落ちしながら他を当たってみると、
TechNet Online -Oracle から MS SQL Server 7.0 へのデータベースの移行
http://www.microsoft.com/japan/technet/prodtechnol/sql/deploy/upgrdmigrate/oracle.asp
を読むと
>SQL Server では、
>INTERSECT 集合演算子および MINUS 集合演算子をサポートしていませんが、
>EXISTS 句と NOT EXISTS 句を使うと同じ結果が得られます。
あらら、攻めどころが違ったのね。
なんか変なSQL文だけど、
http://www.ken3.org/cgi-bin/test/test104-1.asp
で、
Select * From T_2003年売上 T2003"
Where NOT EXISTS
(Select * From T_2002年売上 T2002
Where T2002.商品CD = T2003.商品CD
AND T2002.売上金額 = T2003.売上金額)
と発行してみました。
結果は、
商品CD 売上金額
CCCC 500
なんとか、A001 100を取り除いて表示されてるけど。。。
今度は基準のテーブルを逆にして、
Select * From T_2002年売上 T2002"
Where NOT EXISTS
(Select * From T_2003年売上 T2003
Where T2002.商品CD = T2003.商品CD
AND T2002.売上金額 = T2003.売上金額)
と、基準を2002年にすると、
http://www.ken3.org/cgi-bin/test/test104-2.asp
商品CD 売上金額
B002 50
A001 20
CCCC 1200
↑みたいになり、
共通する、A001 100を取り除いて集合を作ることができます。
^^^^^^^^^^^^^^^^^^
テストデータ元
Select * From T_2002年売上
商品CD 売上金額
A001 100
B002 50
A001 20
CCCC 1200
Select * From T_2003年売上
商品CD 売上金額
A001 100
CCCC 500
/*
* 5.終わりの挨拶 </HTML>
*/
今回は、
集合(テーブル)の差を求めたくて、
Minusを発見するが、
MS SQLServerに無し、EXISTS 句と NOT EXISTS 句を使え?
ってことで、
Select * From T_2003年売上 T2003"
Where NOT EXISTS
(Select * From T_2002年売上 T2002
Where T2002.商品CD = T2003.商品CD
AND T2002.売上金額 = T2003.売上金額)
↑こんなSQLを作ってみました。
質問は、
---
>テーブル AとBがあります。A,Bともに 伝票aA伝票行、商品名で構成
>されています。
>
>質問ですが、Bの抽出条件は、Aのbニ同じBの伝票bナ、Aの伝票行と違う
>データだけを抽出したいのですが..。
---
なので、Bテーブルを基準にAと同じデータを取り除きたいので、
Select * From Bテーブル BB
Where NOT EXISTS
(Select * From Aテーブル AA
Where AA.伝票No = BB.伝票No
AND AA.伝票行 = BB.伝票行 )
で、いけるかな?
○○したあとのタバコはうまいとよく聞くが(オイオイ,タバコ吸わないでしょアンタ)
終わったなぁと一息ついてると
いつもの読者の心の声(クレーム)が聞こえてきました、
そんなEXISTS 句と NOT EXISTS 句使わなくても、
オレ様が頭に浮かんだキーワード1つ教えてやろうか!!!
えっ、どんなキーワード?
LEFT JOIN だよJOIN
^^^^^^^^^^
なんですか?それ?
Access好きなのに知らないのアンタ。
はい、読者さん達ほどSQLに詳しくないので・・・
次回は、LEFT JOIN かな?
今回も、中途半端ですが、
何かの参考となれば幸いです。
ASP、VBScript勉強中の三流プログラマーのKen3でした。
PS.正直今回、メルマガ書きながらサンプル作ってました。
Minusを発見して楽勝と思ったのですが、失敗失敗。。。
OracleファンはMinus使っているのかなぁ?それともLEFT JOIN?
フィードバック
ASP系の→[掲示板]←を覗く、質問を書き込む
評価・感想
三流君の主なリンク先
[アクセスランキング]
[サイトマップ]
[リンク先・相互リンク先など]
Ken3の日記(weblog) --
[プログラマー業務の愚痴]
[VBA系の話題]
[ASP系の話題]
[コンビニ系ネタ]
[その他]
その他 宣伝広告