同様の質問がなされたと思いますが、自分に合った解決策を見つけることができません。
デジタル化された本とそのページを並べ替えるために使用するデータベースがあり、地図を含む数千ページを並べ替えようとしています。最初に使用している2つのテーブルのうち、本のすべてのページとそれらが本で発生する順序を一覧表示します。3つの列(bookID、pageOrder、pageID)があり、各ページには独自の行があります。 2番目のテーブルには、各ページで発生するすべての場所(マップ内)が一覧表示されます。1つのページに複数の場所がある場合は2つの列(pageID、placeID)があり、各場所のテーブルに新しい行が追加されます。
私がする必要があるのは、すべてのpageID/placeIDの組み合わせに一意の番号を与えるselectステートメントを作成することですが、番号は本に表示されている順序にする必要があります。 SQL Serverでは、次のようにします。
SELECT ROW_NUMBER() OVER(ORDER BY bp.bookID, bp.pageOrder, pp.placeID) AS uniqueNumber, pp.pageID, pp.placeID
FROM booksAndPages AS bp INNER JOIN pagesAndPlaces AS pp ON bp.pageID = pp.pageID
残念ながら、私はAccessを使用して立ち往生しています。理想的には、上記のような単一のSQLステートメントで(可能であれば)それを実行したいのですが、VBAを使用して試してみます。
どんな助けでも大歓迎です。
これはあなたが望むクエリです:
SELECT ROW_NUMBER() OVER (ORDER BY bp.bookID, bp.pageOrder, pp.placeID) AS uniqueNumber,
pp.pageID, pp.placeID
FROM booksAndPages AS bp INNER JOIN
pagesAndPlaces AS pp
ON bp.pageID = pp.pageID;
相関サブクエリを使用して同じ結果を得ることができます。より複雑でより高価ですが、可能です:
SELECT (select count(*)
from booksAndPages AS bp2 INNER JOIN
pagesAndPlaces AS pp2
ON bp2.pageID = pp2.pageID
where bp2.bookID < bp.bookID or
(bp2.bookID = bp.bookID and bp2.pageOrder < bp.pageOrder) or
(bp2.bookID = bp.bookID and bp2.pageOrder = bp.pageOrder and
bp2.placeId <= pp.PlaceId
)
) as uniqueNumber,
pp.pageID, pp.placeID
FROM booksAndPages AS bp INNER JOIN
pagesAndPlaces AS pp
ON bp.pageID = pp.pageID;
これは、bookId
、pageOrder
、placeId`の組み合わせが一意であることを前提としています。
これは古い質問だと思いますが、これは上位の検索であり、インターネット上で他の解決策を見たことがないので、これが他の人に役立つことを願っています。
私のソリューションは、一意の識別子があるかどうかに関係なく、どのデータセットでも機能します。
次のVBAコードをモジュールに追加します。
Public row as Variant
Function RowNum(dummy) As Integer
row = row + 1
RowNum = row
End Function
Function GetRowNum(dummy) As Integer
GetRowNum = row
End Function
Function ResetRowNum()
row = 0
End Function
次に、サンプルクエリを示します。
SELECT Table1.Field1, Table1.Field2, RowNum([Field1]) AS RowId,
"Row: "&GetRowNum([Field1]) AS RowText
FROM Table1
必要に応じて、「ORDERBY」または「GROUPBY」を追加できます。クエリ出力に含まれる任意のフィールドを、RowNum
およびGetRowNum
の入力として使用できます。注意すべき重要な点は、行番号が必要なのは初めてRowNum
のみを使用し、その後は毎回GetRowNum
を使用することです。これは、1つの行がカウンターを複数回増やすのを防ぐためです。
最後に行う必要があるのは、ResetRowNum
を実行するマクロを作成し、このメソッドで使用するすべてのクエリの後に実行することです。マクロまたはVBAを介して一連のクエリを実行している場合は、必ずこれらの関数を使用するすべてのクエリの後にResetRowNum
を実行します。
また、スクロールすると数式が常に再計算され、数値が着実に増加するように見えるため、データシートビューは避けてください。