7

我相信有人问过类似的问题,但我找不到适合我的解决方案。

我有一个数据库,用于对数字化书籍及其页面进行排序,我正在尝试对包含地图的数千页进行排序。在我使用的两个表中,第一个列出了一本书中的所有页面以及它们在书中出现的顺序,它有三列(bookID、pageOrder、pageID),每一页都有自己的行。第二个表列出了每个页面上出现的所有地方(在地图中),如果一个页面上有多个地方,则它有两列(pageID,placeID),然后为每个地方添加一个新行到表中。

我需要做的是创建一个 select 语句,为每个 pageID/placeID 组合提供一个唯一编号,但这些编号必须按照它们在书中出现的顺序排列。在 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。

任何帮助是极大的赞赏。

4

3 回答 3

3

这是您想要的查询:

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` 是唯一的。

于 2013-09-12T00:43:35.790 回答
1

我知道这是一个老问题,但这是一个热门搜索,我还没有在互联网上看到任何其他解决方案,所以我希望这对其他人有帮助。

我的解决方案适用于任何数据集,无论它是否具有唯一标识符。

将以下 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

如果您愿意,您可以添加任何“ORDER BY”甚至“GROUP BY”。您可以将查询输出中的任何字段用作RowNumand的输入GetRowNum。需要注意的重要一点是,仅RowNum在您想要行号的第一次使用并GetRowNum在之后每次使用。这是为了防止一行多次增加计数器。

您需要做的最后一件事是创建一个宏,该宏ResetRowNum在您使用此方法的每个查询之后运行并运行它,或者如果您通过宏或 VBA 运行一系列查询,请确保ResetRowNum在使用的每个查询之后运行这些功能。

还要避免查看数据表视图,因为它似乎在您滚动时不断地重新计算公式,从而使数字稳步增加。

于 2014-08-28T20:37:00.443 回答
-2

查询排序和/或分组

SELECT Table1.Field1, 
       Table1.SomeDate, 
       Table1.Field2,
       RowNumber([Field1]) AS RowId,
       "Row: " & GetRowNum([Field1]) AS RowText
FROM Table1
ORDER BY Table1.Field1, Table1.SomeDate;

Field1  Field2  RowId   RowText
James   2   1   Row: 1
James   35  2   Row: 2
James   6   3   Row: 3
James   86  4   Row: 4
James   67  5   Row: 5
James   35  6   Row: 6
Maria   4   1   Row: 1
Maria   54  2   Row: 2
Samuel  46  1   Row: 1
Samuel  32  2   Row: 2
Samuel  7   3   Row: 3
Thomas  43  1   Row: 1
Thomas  65  2   Row: 2
Thomas  5   3   Row: 3

Public StoredRowNumber As Variant
Public OldlastField As Variant

Function RowNumber(TheField) As Integer
    If OldlastField = TheField Then
        'nada
    Else
        ResetRowNum
    End If
    StoredRowNumber = StoredRowNumber + 1
    RowNumber = StoredRowNumber
    OldlastField = TheField
End Function

Function GetRowNum(TheField) As Integer
    GetRowNum = StoredRowNumber
End Function

Function ResetRowNum()
    StoredRowNumber = 0
    'OldFieldItem = Null
End Function
于 2016-01-25T16:06:12.467 回答