Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Access select语句中的行号()_Sql_Ms Access_Row Number - Fatal编程技术网

Sql Access select语句中的行号()

Sql Access select语句中的行号(),sql,ms-access,row-number,Sql,Ms Access,Row Number,我相信也有人问过类似的问题,但我无法找到一个适合我的解决方案 我有一个数据库,我用它来对数字化的书籍和它们的页面进行排序,我正试图对包含地图的数千页进行排序。在我使用的两个表中,第一个表列出了书中的所有页面以及它们在书中出现的顺序,它有三列bookID,pageOrder,pageID,每个页面都有自己的行。第二个表列出了地图中每个页面上出现的所有位置,它有两列pageID,placeID如果一个页面上有多个位置,则会为每个位置向表中添加一个新行 我需要做的是创建一个select语句,为每个pa

我相信也有人问过类似的问题,但我无法找到一个适合我的解决方案

我有一个数据库,我用它来对数字化的书籍和它们的页面进行排序,我正试图对包含地图的数千页进行排序。在我使用的两个表中,第一个表列出了书中的所有页面以及它们在书中出现的顺序,它有三列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


非常感谢您的帮助。

这是您需要的查询:

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
如果您愿意,您可以添加任何“订单依据”甚至“分组依据”。您可以使用查询输出中的任何字段作为RowNum和GetRowNum的输入。需要注意的重要一点是,仅在第一次需要行号时使用RowNum,之后每次都使用GetRowNum。这是为了防止一行计数器多次增加

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


还应避免使用数据表视图,因为在滚动时,它似乎会不断重新计算公式,使数字稳步增加。

查询以进行排序和/或分组

SELECT Table1.Field1, 
       Table1.SomeDate, 
       Table1.Field2,
       RowNumber([Field1]) AS RowId,
       "Row: " & GetRowNum([Field1]) AS RowText
FROM Table1
ORDER BY Table1.Field1, Table1.SomeDate;
作为变体的公共存储编号 公共OldlastField作为变量 函数RowNumberTheField为整数 如果OldlastField=字段,则 “娜达 其他的 ResetRowNum 如果结束 StoreDiverNumber=StoreDiverNumber+1 RowNumber=storecrownember OldlastField=字段 端函数 函数GetRowNumTheField为整数 GetRowNum=storecrownumber 端函数 函数ResetRowNum 数字=0 'OldFieldItem=Null 端函数
检查此解决方案请参阅解决方案2关于要排序或分组的DCount查询:当我滚动并单击结果时,函数返回的值似乎会更新。另外,如果我在函数列中添加WHERE子句,其中RowID=1,则得到的结果显示RowID=2也非常正确。我用它来做访问报告。一种VBA存储过程,我需要一个大数据集中的第三项。如果将其用作屏幕表单,则需要将其作为临时表引入,或者如果需要返回到实时生产表并进行更新,则需要使用唯一的记录标识符。但这是一个非常不同的故事,有创纪录的锁和整个9码。大概9.7码。这是特别需要的:一个报告过程;非常大的数据集;一个特定的行号;不需要视图。ie SQL Server在AccessStill中的行数只是一个开始,考虑到它是VBA,天空限制了功能的扩展。问题是,我搜索了多个站点,但都没有结果,所以我不得不花时间来构建它,我将它提供给下一个人。您的RowNum函数可以接受第二个可选的布尔参数,以确定行何时不应被提升。这样就不需要GetRowNum函数了。
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