[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.104 ADO SQL文のNOT EXISTS 句で集合の差を求める

ADO SQL文のNOT EXISTS 句で集合の差を求める

集合(テーブル)の差を求めたくて、googleの検索からMinus 演算子を発見する
ASPで Minus 演算子を使い、複数テーブルをSelectしてみました

Select * From T_2003年売上
 Minus
  Select * From T_2002年売上
↑こんなSQLを書くと・・・
Microsoft JET Database Engine エラー '80040e14'
FROM 句の構文エラーです。

あらら、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を作ってみました。
解説と実行サンプルを見てください。



本文(発行内容)


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?


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


(感想や質問・要望・苦情はHPで記事に載せることがあります。)

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: