<SQL Select DISTINCT キーワードで重複結果の出力をハジク>
こんにちは、三流プログラマーのKen3です。 今回は、 SQL Select DISTINCT キーワードを使用して、 重複結果の出力を取り除いてみたいと思います。/* * 1.今回のキッカケ */
隣のVBA系のメルマガで、 Access サブフォームで連結 重複を弾いてメインに表示 http://www.ken3.org/backno/backno_vba22.html#106 --- >親フォームが音楽のバンド名が記載されてます。 >サブフォームには、 >そのバンドのメンバーと出身県と楽器と年齢などが記載されています。 > >そこで、親フォームには、そのバンドのメンバーの出身県が出るテキスト >ボックスがあります。 > >例えば・・・バンド名(BOOWY)−−−−−−−−−−親フォーム > メンバー(氷室、布袋、松井、高橋)−−サブフォーム > 出身県(群馬、群馬、群馬、福島)−−−サブフォーム > >●質問1 > >で、このサブフォームに記載されている、出身県を親のフォームの >任意に作成したテキストボックスの中に「群馬、福島」とだけ表示したいのです。 > >「群馬、群馬、群馬、福島」と表示するのは、ちょっと・・・。 >群馬がだぶっているので、群馬の表示は1つとしたいのです。 --- と、データが群馬、群馬、群馬、福島と4件あって、 結果を重複を除いて、群馬、福島と2件表示したい、 そんな処理を考えてました。/* * 2.力技とSQLを使った方法 */
はじめは、VBAのプログラマーらしく、 ループを使ってレコード全てをチェックしてました。 ^^^^^^^^^^^^^^^^^^^^^^ 'T_メンバーテーブルから出身地をバンドIDがフォームの値と一緒 strSQL = "Select 出身地 From T_メンバー " _ & " Where バンドID = " & Me![バンドID] こんな感じで、SQL文を作成して、 'レコードセットを開く rs.Open strSQL, CurrentProject.Connection, _ adOpenKeyset, adLockOptimistic レコードセットを作り、 レコードの最後までループ、 'ループ処理 str出身地 = "" '空文字で初期化 While rs.EOF = False 'いつものEOFが偽の間 'バッファの中に同じ出身地があるか場所をチェックする n = InStr(str出身地, rs.Fields("出身地")) If n = 0 Then '出身地が見つからなかったら(重複してない時) '出身地と" "スペース1つを+する str出身地 = str出身地 & rs.Fields("出身地") & " " End If rs.MoveNext '次のレコードに移動しないと、とんでもないことに(笑) Wend ループの中で、同じ出身地のチェックを行い、データの重複を取り除いてました。 SQL文で、重複を取り除くって考えると、 頭に浮かんだのが、Group By を使用して、 グループ化のレコードセットを作成する方法でした。 No.38 SQL GROUP BY句 で グループ化する http://www.ken3.org/backno/backno_asp08.html#38 で、 ログデータからURLを表示するために Set rs = db.Execute("Select URL From log GROUP BY URL") と、SQL文を指定してます。 http://www.ken3.org/cgi-bin/test/test038-1.asp を実行すると、 No. URL 1 http://www.ken3.org 2 http://www.ken3.org/ 3 http://www.ken3.org/24h/ 4 http://www.ken3.org/24h/add24h.html ・ ・ ・ とグループ化されてURLが表示されます。 同様に、GROUP BY 出身地 と グループ化して重複を取り除いてもよかったのですが、 何かないかなぁと調べていると、 SQL Select文で、 んっ? DISTINCTキーワード? ~~~~~~~~ 騙されたと思って、 Select DISTINCT 〜で、SQL文作ってみた。 'T_メンバーテーブルから出身地をバンドIDがフォームの値と一緒 strSQL = "Select DISTINCT 出身地 From T_メンバー " _ & " Where バンドID = " & Me![バンドID] と、Selectの後にキーワードを+してみます。 おっ、動きましたよ(笑)、出身地の重複がないレコードセットが返って来ました。 GROUP BY で Countなどのグループ単位の集計関数使わない時は、 Select DISTINCT で 制御するのもアリかなぁと思いました。 cnt.mdb から訪問されたURLを Set rs = db.Execute("Select DISTINCT URL From log") と、SQL文を指定してテストで取り出してみます。 http://www.ken3.org/cgi-bin/test/test070-1.asp で、テスト実行できます。 気になる処理時間は あまり変わらないかなぁ。 ※処理事態が全てのデータを見に行くからね。/* * 3.終わりの挨拶 </HTML> */
今回は、 SQL Select文で DISTINCT キーワードを使ってみたサンプルでした。 SQLって奥が深いですね・・・ SQLの魔術師はムリでも、 SQLの手品師ぐらいにはなりたいですね。 えっ、Ken3は、SQLのペテン師だろって? なんて読者の声が聞こえてこないうちに、今回は退散です。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(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記事 バックナンバー目次]