Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(指定なし : 指定なし)
SQLで連番を一発で振るには? 
投稿日時: 23/02/03 01:44:12
投稿者: おそまつ

SQLで連番を一発で振るには? 
 
ROW_NUMBERがアクセスで使えない。
Dcountもたぶん無理っぽい。
 
select
 ROW_NUMBER
 ,tmp.オートナンバー
 ,tmp.xxx1
 ,tmp.xxx2
 ,tmp.xxx3
from
(
  とても複雑なSQL
)tmp

回答
投稿日時: 23/02/03 10:51:23
投稿者: sk

おっしゃる通り、Access SQL には ROW_NUMBER のような
レコードセットの行番号をダイレクトに返す関数は実装されていません。
 
クエリにおける代替手段としては、Count 関数を用いたサブクエリか
自己結合クエリ、あるいは DCount 関数を用いて「一定の条件に
該当するレコードの件数」をレコードごとに取得し、それぞれの結果が
ユニークかつシーケンシャルな数値として返される演算フィールドを
設けるのが一般的です。
 

引用:
select
 ROW_NUMBER
 ,tmp.オートナンバー
 ,tmp.xxx1
 ,tmp.xxx2
 ,tmp.xxx3
from
(
  とても複雑なSQL
)tmp

しかし、メインクエリの FROM 句でサブクエリを呼び出したり、
複数のテーブル/クエリ同士で JOIN したりしている場合は、
DCount 関数が使えなかったり、SELECT 句で呼び出すサブクエリが
複雑になったりと難があります。
 
そのような場合は、そのクエリをオブジェクトとして保存するか、
あるいはそのクエリの結果を別のテーブルに出力するかした上で、
そのテーブル/クエリを別のクエリから呼び出して
前述のいずれかの方法を採られた方が無難です。
 
もしそのクエリの結果に「全てのフィールドの値が完全に一致している
( Count や DCount の結果が必ず同じ値となる)レコード」が
複数件混在している場合、前述の方法ではユニークな値を
取得することが出来ませんので、クエリ以外のオブジェクトを
利用することになるでしょう。
 
例えば、もし「そのクエリをレポートのレコードソースとした上、
レコードごとに行番号を印字したい」といった場合は、
クエリではなくレポート側の設定やモジュールによって
連番を出力する形を採られた方がよいでしょう。

回答
投稿日時: 23/02/03 11:03:49
投稿者: hatena
投稿者のウェブサイトに移動

VBA板なのでVBAで連番を出力するということも想定しているなら、下記のリンク先が参考になるでしょう。
 
グループ毎連番を自動入力する関数 - hatena chips
https://hatenachips.blog.fc2.com/blog-entry-428.html

投稿日時: 23/02/06 22:23:39
投稿者: おそまつ

Count 関数を用いたサブクエリでなんとかいけました。