use*_*656 7 sql ms-access row-number
我相信已经提出了类似的问题,但我找不到适合我的解决方案.
我有一个数据库,用于对数字化书籍及其页面进行排序,我正在尝试对包含地图的数千页进行排序.在我使用的第一个列表的两个表中列出了书中的所有页面以及它们在书中出现的顺序,它有三列(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
Run Code Online (Sandbox Code Playgroud)
不幸的是,我坚持使用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;
Run Code Online (Sandbox Code Playgroud)
使用相关子查询可以获得相同的结果。更复杂、更昂贵,但有可能:
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;
Run Code Online (Sandbox Code Playgroud)
这假设组合bookId
, pageOrder
, placeId` 是唯一的。