出来るのだASP Q&A掲示板(過去LOG)  訪問数 52046 昨日 889 今日 776
    【PR】 パソコン入門からIT専門書まで幅広く取り揃えています。セブン-イレブン受取り手数料無料のセブンアンドワイ。
Topに戻る 掲示板に戻る 検索 削除 管理者

サブクエリを使わないでデータを抽出   Ryoさん [2004/06/16 11:34:20] [4370]
  Re:サブクエリを使わないでデータを抽出   YasNet(管理人)さん [2004/06/16 12:16:33] [4371]
    Re:サブクエリを使わないでデータを抽出   Ryoさん [2004/06/16 13:08:38] [4373]
      Re:サブクエリを使わないでデータを抽出   YasNet(管理人)さん [2004/06/16 13:25:32] [4374]
        Re:サブクエリを使わないでデータを抽出   Ryoさん [2004/06/16 14:52:11] [4375]
    Re:サブクエリを使わないでデータを抽出   通りすがりさん [2004/06/17 15:06:28] [4385]

[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
Program By YasNet