访问SQL - 为多表连接的查询结果添加行号

时间:2016-10-12 15:06:01

标签: sql ms-access join row-number

我想做的事情相当简单。 我只想在查询中添加行号。由于这在Access中比其他SQL困难一些,但在正常情况下使用DCount或Select Count(*)等解决方案仍然可行,例如:How to show row number in Access query like ROW_NUMBER in SQLAccess 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.DisplayOrderENUM_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;

同时我的结果:

  1. Aren不是连续的(顺序注意前四个显示,但最后两行不是这样)!尽管最后两行的优先级低于它们上面的记录,但它们的Counter值较低,只是因为它们的RequestID较低。
  2. 他们不会从&#34; 1&#34;并为每条新记录增加+1。
  3. 理想结果

    因此,我上面的理想结果将是:

    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选项标记为答案。

1 个答案:

答案 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

这种不幸的副作用是表返回的数据越多,内联子查询计算所需的时间就越长。但是,这是获取行号的唯一方法。它确实取决于在表中有一个主键。在这种特殊情况下,它不必是明确定义的主键,它只需要是每个记录完全唯一的字段或字段组合。