出来るのだASP Q&A掲示板(過去LOG)
訪問数 52046
昨日 889
今日 776 【PR】 パソコン入門からIT専門書まで幅広く取り揃えています。セブン-イレブン受取り手数料無料のセブンアンドワイ。 |
![]() ![]() ![]() ![]() ![]() |
![]() ![]() |
![]() ![]() ![]() ![]() ![]() |
[4370] サブクエリを使わないでデータを抽出 |
投稿者:Ryoさん 2004/06/16 11:34:20 |
こんにちは。お聞きしたいことがあるのですが。 サブクエリを使わずに該当データを抽出する方法で悩んでいます。 (使用DBがMySQLなのでサブクエリが使えないのです。) まずテーブル1から該当するデータを数件抽出します。 次に、テーブル2からテーブル1で抽出したデータ数件に該当するデータを 抽出します。 わかりやすく例を用いると、 たとえば、テーブル1から氏名を抽出。 氏名がAさん、Bさん、Cさん、Dさんが出たとします。 次にテーブル2で氏名がAさん、Bさん、Cさん、Dさんであるもの(データ) を抽出します。 これをSQLでどうやって書けばいいのか・・ で、考えたのですが、要するに StrSQL="select * from テーブル2 where 氏名 in (A,B,C,D) というふうにin演算子を用いて、氏名がAまたはBまたはCまたはDのものを 抽出するというふうにしようかと考えました。 そこで、まずテーブル1で抽出したデータを配列に入れてSQL文を走らせようと したのですが、その記述方法がエラーが出てわかりません。 ソースを一部書きます。 dim Hairetu() '配列を作る Redim Preserve Hairetu(0) Do while ObjRS("氏名").EOF = False '抽出されたデータ数分ループさせる name = ObjRS("氏名") Redim preserve Hairetu(Ubound(Hairetu)+1) Hairetu(i) = name '配列に入れていく ObjRS.MoveNext i = i+1 Loop これでHairetu(0)=A、Hairetu(1)=B・・・という風にデータが入ってるはずなのですが・・ その後がわかりません。 StrSQL = "select * from テーブル2 where 氏名 in " StrSQL = StrSQL & "(" &Hairetu(0) & "," & Hairetu(1) & ・・・")" という文を作りたいのですが、 Forでループさせようと思って StrSQL ="select * from テーブル2 where 氏名 in (" StrSQL =StrSQL & For i=0 to Ubound(Hairetu) Hairetu(i)& i=i+1 Next &")" とすると文法がおかしいとエラーが出ます。 ここの記述方法を教えていただきたいのです。 in の中をForで配列をループする記述方法をどなたか教えてください。 お願いします。 |
[4371] Re:サブクエリを使わないでデータを抽出 |
投稿者:YasNet(管理人)さん 2004/06/16 12:16:33 |
こんにちは YasNet(管理人)です。 テストはしてませんが イメージは、こんな感じでは? > Forでループさせようと思って > StrSQL ="select * from テーブル2 where 氏名 in (" > StrSQL =StrSQL & For i=0 to Ubound(Hairetu) Hairetu(i)& i=i+1 Next &")" StrSQL ="select * from テーブル2 where 氏名 in (" For i=0 to Ubound(Hairetu) StrSQL =StrSQL & Hairetu(i) & "," Next '--- 手抜き(最後の,が不要なので消す) StrSQL = Left(StrSQL, Len(StrSQL) - 1) StrSQL =StrSQL & ")" それでは 失礼致します。 |
[4373] Re:サブクエリを使わないでデータを抽出 |
投稿者:Ryoさん 2004/06/16 13:08:38 |
こんなに早くレスありがとうございます! 管理人さんのアドバイスを参考にやってみたらできました! > StrSQL ="select * from テーブル2 where 氏名 in (" > For i=0 to Ubound(Hairetu) > StrSQL =StrSQL & Hairetu(i) & "," > Next > '--- 手抜き(最後の,が不要なので消す) > StrSQL = Left(StrSQL, Len(StrSQL) - 1) > > StrSQL =StrSQL & ")" ただ、最後の,を消すときに StrSQL = Left(StrSQL, Len(StrSQL) - 2) と1を2に変えなきゃだめなんです・・ なんか配列がおかしいのか、 , を 消す前のSQLをresponse.writeで出力してみると inの後が in (1,13,14,15,16,19,20,, となっているのです。 なぜカンマが2つあるのか・・?? よろしければ配列の作り方におかしい箇所があるか 見ていただけますか? |
[4374] Re:サブクエリを使わないでデータを抽出 |
投稿者:YasNet(管理人)さん 2004/06/16 13:25:32 |
こんにちは YasNet(管理人)です。 Ubound(Hairetu) -1で解決すると思います。 0はじまりなので・・・総数-1が正解ですね。 失礼しました。 それでは 失礼致します。 > こんなに早くレスありがとうございます! > 管理人さんのアドバイスを参考にやってみたらできました! > > > StrSQL ="select * from テーブル2 where 氏名 in (" > > For i=0 to Ubound(Hairetu) > > StrSQL =StrSQL & Hairetu(i) & "," > > Next > > '--- 手抜き(最後の,が不要なので消す) > > StrSQL = Left(StrSQL, Len(StrSQL) - 1) > > > > StrSQL =StrSQL & ")" > > ただ、最後の,を消すときに > > StrSQL = Left(StrSQL, Len(StrSQL) - 2) > > と1を2に変えなきゃだめなんです・・ > なんか配列がおかしいのか、 , を > 消す前のSQLをresponse.writeで出力してみると > inの後が > > in (1,13,14,15,16,19,20,, > > となっているのです。 > なぜカンマが2つあるのか・・?? > よろしければ配列の作り方におかしい箇所があるか > 見ていただけますか? > |
[4375] Re:サブクエリを使わないでデータを抽出 |
投稿者:Ryoさん 2004/06/16 14:52:11 |
ああー!なるほど!そうですね。 よく解りました! ホントに早いレス、どうもありがとうございました! > Ubound(Hairetu) -1で解決すると思います。 > 0はじまりなので・・・総数-1が正解ですね。 > 失礼しました。 > > それでは 失礼致します。 |
[4385] Re:サブクエリを使わないでデータを抽出 |
投稿者:通りすがりさん 2004/06/17 15:06:28 |
こんなの一行で書けます。 StrSQL ="select * from テーブル2 where 氏名 in (" & Join(Hairetu,",") & ")" > StrSQL ="select * from テーブル2 where 氏名 in (" > For i=0 to Ubound(Hairetu) > StrSQL =StrSQL & Hairetu(i) & "," > Next > '--- 手抜き(最後の,が不要なので消す) > StrSQL = Left(StrSQL, Len(StrSQL) - 1) > > StrSQL =StrSQL & ")" ちなみに、Ver.4.1以降のMySQLはサブクエリのSQLをサポートしています。 あとはこちらでもご覧いただいてSQLを勉強してください。 http://dev.mysql.com/doc/mysql/ja/Rewriting_subqueries.html |
TreeBBS For ASP V.0.1.3 |