集合(テーブル)の差を求めたくて、googleの検索からMinus 演算子を発見する
ASPで Minus 演算子を使い、複数テーブルをSelectしてみました
Select * From T_2003年売上 Minus Select * From T_2002年売上↑こんなSQLを書くと・・・
Select * From T_2003年売上 T2003 Where NOT EXISTS (Select * From T_2002年売上 T2002 Where T2002.商品CD = T2003.商品CD AND T2002.売上金額 = T2003.売上金額)↑こんなSQLを作ってみました。
こんにちは、三流プログラマーの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?
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[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記事 バックナンバー目次]