首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问SQL -添加行号以查询多表连接的结果

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

Stack Overflow用户
提问于 2016-10-12 15:06:00
回答 1查看 1.1K关注 0票数 1

我想做的事情很简单。--我只想向查询添加一个行号。因为这是在访问中,所以访问比其他SQL要困难一些,但是在正常情况下仍然可以使用DCount或Select (*)之类的解决方案,例如:NUMBER in SQLAccess SQL how to make an increment in SELECT query

我的问题

我的问题是,我试图将此计数器添加到多连接查询中,该查询按字段从多个表中排序。

故障排除

我的代码有点荒谬(19个字段,其中7个是长表达式,来自9个不同的连接表,按字段从其中的5个表中排序)。为了使事情变得简单,下面有一个简单的示例查询:

示例查询

代码语言:javascript
复制
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;

如果上面的代码试图从不包括的表中选择一个字段,我很抱歉--相信字段来自某个地方(lol,也就是我排除在查询之外的另一个联接)。这方面的一个很好的例子是在.DisplayOrder表达式中使用的ORDER BY字段。这些字段是表中的字段,它们简单地确定枚举的“优先级”。示例:Requests_T.RequestOverridePriority以“低”、“地中海”、“高”的组合框选项显示给用户。因此,在表格中,我分别给这些选项指定了"1“、"2”和"3“的数字优先级。因此,当ENUM_RequestPriority_T.DisplayOrder DESCorder by__中被调用时,所有“高”优先级请求都将显示在“中等”和“低”的上面。ENUM_UserGroups_T.DisplayOrderENUM_RequestNbrUsers_T.DisplayOrder__也是如此。

由于效率原因,我也不愿使用DCOUNT,而是执行如下操作:

代码语言:javascript
复制
select count(*) from Requests_T where Requests_T.RequestID>=RequestID) as counter

但是,由于使用了"Order“表达式,我的”计数器“实际上并不按顺序计算所产生的行,因为我的两个示例都绑定到RequestID上。

示例结果

根据我的实际查询结果,我对上面的查询做了一个示例结果。

代码语言:javascript
复制
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

该查询以正确的顺序显示我的结果(最接近的截止日期在顶部,然后是优先级最高的,然后是用户组,然后是用户的#,最后,如果其他所有内容都相同,则按提交日期进行排序)。然而,,我的“计数器”值是完全错误的!计数器字段应该只是吸引+1的每一个新行。因此,如果在窗体上为用户显示单个请求,我可以这样说。

“您是number:与开发队列中的Counter关联的RequestID。”

同时,我的结果:

  1. 不是连续的(注意前四行按顺序显示,但最后两行没有)!尽管最后两行的优先级低于上面的记录,但它们最终得到的Counter值较低,这仅仅是因为它们的RequestID较低。
  2. 它们不会从"1“开始,并对每个新记录增加+1。

理想结果

因此,我的理想结果是:

代码语言:javascript
复制
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。快把我逼疯了!任何帮助都将不胜感激。

FYI -如果可能的话,我更喜欢使用选项。非常受欢迎,如果它有效的话,肯定会得到一个up投票和我的巨大感谢,但是我想标记一个SQL选项作为答案。

EN

回答 1

Stack Overflow用户

发布于 2017-06-18 03:30:17

总之,MS不像其他客户端那样具有非常有用的ROW_NUMBER()函数。所以我们只能即兴发挥了。

由于查询非常复杂,而且MS Access不支持通用表表达式,因此我建议您执行两个步骤。首先,将您已经编写的IntermediateQuery查询命名为。然后,编写名为FinalQuery的第二个查询,执行以下操作:

代码语言:javascript
复制
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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40002050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档