[三流君] −−> [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系の→[掲示板]←を覗く、質問を書き込む

評価・感想

No.999を読んだ満足度(評価)は?
5満足(参考になった)
4まぁまぁ(一部参考になった)
3普通(どちらとも言えない)
2なんかなぁ(期待と違った)
1不満(読んで損した気分)
作者に感想・質問を送る場合は下記に気軽に書いてください
あなたのお名前(ニックネーム) さん

作者からの返信は、 不用 E-mail で受信したい
*質問・感想はメルマガで紹介する場合があります

三流君の主なリンク先

[アクセスランキング] [サイトマップ] [リンク先・相互リンク先など]
ASPで遊ぶ、失敗する 掲示板 バックナンバー 登録と解除
三流プログラマー 業務の愚痴 掲示板 バックナンバー 登録と解除
VBAで楽しくプログラミング 掲示板 バックナンバー 登録と解除
コンビニのオモテとウラ話 掲示板 バックナンバー 登録と解除
www.ken3.org(サイト内)から Google を利用して、

Ken3の日記(weblog) -- [プログラマー業務の愚痴] [VBA系の話題] [ASP系の話題] [コンビニ系ネタ] [その他]

その他 宣伝広告