web-dev-qa-db-ja.com

Access selectステートメントのRow_Number()

同様の質問がなされたと思いますが、自分に合った解決策を見つけることができません。

デジタル化された本とそのページを並べ替えるために使用するデータベースがあり、地図を含む数千ページを並べ替えようとしています。最初に使用している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を使用して試してみます。

どんな助けでも大歓迎です。

7
user2770656

これはあなたが望むクエリです:

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;

これは、bookIdpageOrder、placeId`の組み合わせが一意であることを前提としています。

3
Gordon Linoff

これは古い質問だと思いますが、これは上位の検索であり、インターネット上で他の解決策を見たことがないので、これが他の人に役立つことを願っています。

私のソリューションは、一意の識別子があるかどうかに関係なく、どのデータセットでも機能します。

次の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を実行します。

また、スクロールすると数式が常に再計算され、数値が着実に増加するように見えるため、データシートビューは避けてください。

1
Aehetag