我想做的事情相当简单。 我只想在查询中添加行号。由于这在Access中比其他SQL困难一些,但在正常情况下使用DCount或Select Count(*)等解决方案仍然可行,例如:How to show row number in Access query like ROW_NUMBER in SQL或Access SQL how to make an increment in SELECT query
我的问题是我尝试将此计数器添加到多连接查询中,该查询按多个表中的字段排序。
我的代码有点荒谬(19个字段,其中7个是长表达式,来自9个不同的连接表,并按照这些表中的5个字段排序)。为简单起见,我在下面有一个简化的示例查询:
示例查询
SELECT DCount("*","Requests_T","[Requests_T].[RequestID]<=" & [Requests_T].[RequestID]) AS counter, Requests_T.RequestHardDeadline AS Deadline, Requests_T.RequestOverridePriority AS Priority, Requests_T.RequestUserGroup AS [User Group], Requests_T.RequestNbrUsers AS [Nbr of Users], Requests_T.RequestSubmissionDate AS [Submitted on], Requests_T.RequestID
FROM (((((((Requests_T
INNER JOIN ENUM_UserGroups_T ON ENUM_UserGroups_T.UserGroups = Requests_T.RequestUserGroup)
INNER JOIN ENUM_RequestNbrUsers_T ON ENUM_RequestNbrUsers_T.NbrUsers = Requests_T.RequestNbrUsers)
INNER JOIN ENUM_RequestPriority_T ON ENUM_RequestPriority_T.Priority = Requests_T.RequestOverridePriority)
ORDER BY Requests_T.RequestHardDeadline, ENUM_RequestPriority_T.DisplayOrder DESC , ENUM_UserGroups_T.DisplayOrder, ENUM_RequestNbrUsers_T.DisplayOrder DESC , Requests_T.RequestSubmissionDate;
如果上面的代码试图从未包含的表中选择一个字段,我道歉 - 只要相信该字段来自某个地方(大声笑,即我排除的其他连接之一,只是查询)。一个很好的例子是.DisplayOrder
表达式中使用的ORDER BY
字段。这些是来自表格的字段,它简单地确定了&#34;优先级&#34;一个枚举。示例:Requests_T.RequestOverridePriority
向用户显示为&#34;低&#34;,&#34; Med&#34;,&#34;高&#34;的组合框选项。因此,在表格中,我为&#34; 1&#34;,&#34; 2&#34;和&#34; 3&#34;中的这些分配数字优先级。分别对这些选项。因此,当ENUM_RequestPriority_T.DisplayOrder DESC
中调用order by
时,所有&#34;高&#34}优先级请求将显示在&#34; Medium&#34;和&#34;低&#34;。同样适用于ENUM_UserGroups_T.DisplayOrder
和ENUM_RequestNbrUsers_T.DisplayOrder
。
由于效率原因,我也不愿意使用DCOUNT,而是执行以下操作:
select count(*) from Requests_T where Requests_T.RequestID>=RequestID) as counter
由于&#34; Order By&#34;但是,我的计数器&#39;因为我的两个例子都与RequestID相关联,所以实际上并没有按顺序计算我的结果行。
示例结果
根据我的实际查询结果,我做了上述查询的示例结果。
Counter Deadline Priority User_Group Nbr_of_Users Submitted_on RequestID
5 12/01/2016 High IT 2-4 01/01/2016 5
7 01/01/2017 Low IT 2-4 05/06/2016 8
10 Med IT 2-4 07/13/2016 11
15 Low IT 10+ 01/01/2016 16
8 Low IT 2-4 01/01/2016 9
2 Low IT 2-4 05/05/2016 2
查询以正确的顺序显示我的结果(顶部最近的截止日期,然后是优先级最高的那些,然后是用户组,然后是用户数,最后,如果其他所有相等,则是按提交日期排序)。 然而,我的&#34; Counter&#34;值是完全错误的!计数器字段应该只为每个新行感兴趣+1。因此,如果在表单上为用户显示单个请求,我可以说
&#34;你是号码:
Counter
[与RequestID相关] 开发队列。&#34;
同时我的结果:
Counter
值较低,只是因为它们的RequestID
较低。理想结果
因此,我上面的理想结果将是:
Counter Deadline Priority User_Group Nbr_of_Users Submitted_on RequestID
1 12/01/2016 High IT 2-4 01/01/2016 5
2 01/01/2017 Low IT 2-4 05/06/2016 8
3 Med IT 2-4 07/13/2016 11
4 Low IT 10+ 01/01/2016 16
5 Low IT 2-4 01/01/2016 9
6 Low IT 2-4 05/05/2016 2
我被PLSQL和其他软件所破坏,这将是自动lol。这真让我抓狂!任何帮助将不胜感激。
仅供参考 - 如果可能的话,我更喜欢VBA上的SQL选项。 VBA非常受欢迎,肯定会得到一次投票,如果有效的话我会非常感谢,但我&#39 ; d喜欢将SQL选项标记为答案。
答案 0 :(得分:0)
不幸的是,MS Access没有像其他客户端那样非常有用的ROW_NUMBER()函数。所以我们只能做即兴创作。
因为您的查询非常复杂且MS Access不支持公用表表达式,所以我建议您按照两个步骤进行操作。首先,将您已编写的查询命名为IntermediateQuery
。然后,编写第二个名为FinalQuery
的查询,执行以下操作:
SELECT i1.field_primarykey, i1.field2, ... , i1.field_x,
(SELECT field_primarykey FROM IntermediateQuery i2
WHERE t2.field_primarykey <= t1.field_primarykey) AS Counter
FROM IntermediateQuery i1
ORDER BY Counter
这种不幸的副作用是表返回的数据越多,内联子查询计算所需的时间就越长。但是,这是获取行号的唯一方法。它确实取决于在表中有一个主键。在这种特殊情况下,它不必是明确定义的主键,它只需要是每个记录完全唯一的字段或字段组合。