質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

9302閲覧

AccessでのSQLの書き方について教えてください

makino

総合スコア32

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/03/17 04:13

編集2016/03/17 06:25

宜しくお願いします。初心者です。

seiseki_tableとgakusei_mというテーブルに入っているデータを合わせて、
表示させたいと思っています。

seiseki_table.gaku_no(学生番号)の順番を整列させてから、
SQLのSELECTを使ってgakusei_mのテーブルを抽出したいのですが、
書き方がよくわかりません。

まず、Debug.Print rs_rank!seiseki_table.gaku_no
とするとエラーになってしまいます。
Debug.Print rs_rank!gaku_no
でもエラーになるので、複数のテーブルで利用してる時はどのように書けばよろしいでしょうか?

また、
i=1
mySQL = "SELECT * FROM seiseki_table INNER JOIN gakusei_m ON i = gakusei_m.gaku_no "
i=i+1
で、ループするようなこともできなかったので、
1つ1つ値を変えてSELECTする時の方法も教えて頂ければ幸いです。

【追記】
大変失礼致しました。

エラーとしては、
「要求された名前、または序数に対応する項目がコレクションで見つかりません。」
と表示され、デバッグを押すと、
Debug.Print rs_rank!gaku_no, rs_rank!tensu, rs_rank!simei
こちらが示されます。

宜しくお願いします。

SQL

1Sub Ranking() 2 3Dim cnn As ADODB.Connection 'データベース接続時、必須。 4 5Dim rs_seiseki As ADODB.Recordset '(レコードセット用の変数の)宣言。ただ宣言してるだけ。 6Dim rs_gakusei As ADODB.Recordset 7Dim rs_rank As ADODB.Recordset 8 9Dim mySQL As String 'これもただの宣言。 10 11Set cnn = CurrentProject.Connection '接続 12 13Set rs_seiseki = New ADODB.Recordset 'Recordsetオブジェクトに参照(関連付け)する。 14Set rs_gakusei = New ADODB.Recordset 15Set rs_rank = New ADODB.Recordset 16 17Dim tensu_H(100) As Integer 'テストの点数 18Dim gaku_H(100) As Integer '学生番号 19Dim y(100) As Integer '順位 20Dim n As Integer 'データの数 21Dim Onaji As Integer 22Dim Keep As Integer 23 24 25rs_seiseki.Open "seiseki_table", cnn, adOpenKeyset, adLockOptimistic 26rs_seiseki.MoveFirst 27 28'seiseki_tableのデータを配列に格納。 29i = 0 30Do Until rs_seiseki.EOF 31 tensu_H(i) = rs_seiseki!tensu 32 gaku_H(i) = rs_seiseki!gaku_no 33 rs_seiseki.MoveNext 34 i = i + 1 35Loop 36 37n = i - 1 38'* テストの点数順に並び替え。学生番号も一緒に。 39i = 0 'カウンター(比較元) 40Do Until i >= n 41 k = 1 'カウンター(比較先) 42 Do Until i + k > n 43 If tensu_H(i) < tensu_H(i + k) Then 44 hn = gaku_H(i) 45 hx = tensu_H(i) 46 gaku_H(i) = gaku_H(i + k) 47 tensu_H(i) = tensu_H(i + k) 48 gaku_H(i + k) = hn 49 tensu_H(i + k) = hx 50 End If 51 k = k + 1 52 Loop 53 i = i + 1 54Loop 55 56'↓順位y(i)を付ける 57Onaji = 0 '同じ順位が何回連続しているか。 58Keep = 1 '同じ順位の際に、+1せずに保管しておく。 59y(0) = 1 '先頭は必ず1位。 60i = 1 61Do Until i > n 62 If tensu_H(i - 1) = tensu_H(i) Then 63 y(i) = Keep 64 Onaji = Onaji + 1 65 Else 66 Keep = Keep + 1 67 y(i) = Keep + Onaji 68 Keep = Keep + Onaji 69 Onaji = 0 70 End If 71 i = i + 1 72Loop 73 74' 学生番号の早い方へと並び替え 75i = 0 76Do Until i >= n 77 k = 1 78 Do Until i + k > n 79 If gaku_H(i) > gaku_H(i + k) Then 80 hn = gaku_H(i) 81 hx = tensu_H(i) 82 hy = y(i) 83 gaku_H(i) = gaku_H(i + k) 84 tensu_H(i) = tensu_H(i + k) 85 y(i) = y(i + k) 86 gaku_H(i + k) = hn 87 tensu_H(i + k) = hx 88 y(i + k) = hy 89 End If 90 k = k + 1 91 Loop 92 i = i + 1 93Loop 94 95 96i = 0 97Do Until i >= n 98 rs_seiseki.MoveFirst 99 Do Until rs_seiseki.EOF 100 If rs_seiseki!gaku_no = gaku_H(i) Then 101 102 mySQL = "SELECT * FROM seiseki_table INNER JOIN gakusei_m ON (seiseki_table.gaku_no = gakusei_m.gaku_no) " 103 rs_rank.Open mySQL, cnn, adOpenStatic, adLockOptimistic 104 105 'rs_rank.MoveFirst 106 Debug.Print rs_rank!gaku_no, rs_rank!tensu, rs_rank!simei 107 rs_rank.Close 108 i = i + 1 109 End If 110 rs_seiseki.MoveNext 111 Loop 112Loop 113 114cnn.Close 115Set cnn = Nothing 116 117End Sub 118

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shi_ue

2016/03/17 08:02 編集

マークダウンですが、SQLじゃなくて、VBScriptあたりにするといいかもです。
guest

回答1

0

ベストアンサー

新規にクエリを作って、SQLモードにして、

SQL

1SELECT * FROM seiseki_table INNER JOIN gakusei_m ON seiseki_table.gaku_no = gakusei_m.gaku_no;

とやってちゃんとレコードは見えますか?

ループ処理は

Do Debug.Print rs_rank!tensu, rs_rank!simei rs_rank.MoveNext Loop Until rs_rank.EOF ```のようにします。 ###追記 ```VBScript i = 0 Do Until i >= n rs_seiseki.MoveFirst Do Until rs_seiseki.EOF If rs_seiseki!gaku_no = gaku_H(i) Then mySQL = "SELECT * FROM seiseki_table INNER JOIN gakusei_m ON (seiseki_table.gaku_no = gakusei_m.gaku_no) " rs_rank.Open mySQL, cnn, adOpenStatic, adLockOptimistic 'rs_rank.MoveFirst Debug.Print rs_rank!gaku_no, rs_rank!tensu, rs_rank!simei rs_rank.Close i = i + 1 End If rs_seiseki.MoveNext Loop Loop ```この部分ですが、実は学生マスターから氏名を取りたいだけですよね?すでに成績テーブルは取得しているわけですから。 ```VBScript i = 0 Do Until i >= n rs_seiseki.MoveFirst Do Until rs_seiseki.EOF If rs_seiseki!gaku_no = gaku_H(i) Then mySQL = "SELECT * gakusei_m WHERE gaku_no=" & gaku_H(i) rs_rank.Open mySQL, cnn, adOpenStatic, adLockOptimistic 'rs_rank.MoveFirst Debug.Print rs_seiseki!gaku_no, rs_seiseki!tensu, rs_rank!simei rs_rank.Close i = i + 1 End If rs_seiseki.MoveNext Loop Loop ```これでどうでしょうか。 エラーの原因は、`SELECT * FROM seiseki_table INNER JOIN gakusei_m ON (seiseki_table.gaku_no = gakusei_m.gaku_no)`となっていると、`gaku_no`がseiseki_tableとgakusei_mの両方に存在します。 なので、`rs_rank.Fields("seiseki_table.gaku_no")`と指定してやる必要があるからです。 でも、これでは期待通りの動きにはならないので、上記のように修正しました。

投稿2016/03/17 04:32

編集2016/03/17 08:37
shi_ue

総合スコア4437

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

makino

2016/03/17 06:26 編集

ありがとうございます。 クエリのSQLモードで問題なくレコードは見れる状態です。 また、ループ処理の方法参考になりました。 しかし、まだうまく表示されなくて悩んでいます。 どこが悪いのでしょうか・・・
shi_ue

2016/03/17 06:15

うぁ・・・ 回答の方を編集してください。また、マークダウンという表記法があります。コードが見やすくなりますので、 ``` ' コードをここに書く ``` っていう風に回答に書いてください。よろしくです!
shi_ue

2016/03/17 06:16

うまく表示されない、っていうのはどのようにですか? また、エラーが出ていれば具体的に書いてください。
makino

2016/03/17 06:25

申し訳ございませんでした。 回答側に追記しました。
makino

2016/03/18 01:39

ありがとうございました。 無事に思い通りの表示となりました! rs_rank.Fields("seiseki_table.gaku_no")という書き方があるのも知らなかったです。 まだまだわからないことだらけですので、また回答して頂ければ助かります! 本当にありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問