【问题标题】:Access SQL Select most recent records out of a group with conditionsAccess SQL 从有条件的组中选择最近的记录
【发布时间】:2020-06-25 22:08:29
【问题描述】:

我在 MS Access 2016 x64 中有两个表。我想用表cmet的查询结果(字段status_id)更新表事务中的字段status_id,它必须是最近的status_id不是0或6。 无论我尝试什么,即使使用连接,结果仍然没有提供预期的结果(应该是 9 条记录)。

如何创建只选择正确记录的查询?

更新 SQL 非常简单,为了清楚起见省略了。如果我有一个有效的 SELECT 查询,我可以将其更改为更新 SQL。

感谢您的帮助!

Table transactions      
id      trans_no      status_id
12      9483241273    
13      9483241274    
14      9483241275    
15      9483241276    
16      9483241277    
17      9483241343    
18      9483241344    
19      9483241345    
20      9483241346    
21      9483390967   

Table comments
id      trans_id   com_date               status_id
29      12         23-06-2020 16:40:21    1
30      13         23-06-2020 16:40:26    1
31      14         23-06-2020 16:40:32    1
32      15         23-06-2020 16:40:38    1
33      16         23-06-2020 16:40:44    1
34      17         23-06-2020 16:40:50    1
35      18         23-06-2020 16:40:56    1
36      19         23-06-2020 16:41:01    1
37      20         23-06-2020 16:41:07    1
38      15         23-06-2020 16:40:44    6
39      18         25-06-2020 16:40:44    6
40      15         22-06-2020 16:40:38    11

SQL

SELECT comments.trans_id, comments.status_id, MAX(comments.com_date) AS com_date
FROM comments
GROUP BY comments.trans_id, comments.status_id, MAX(comments.com_date)
HAVING comments.status_id<>0 AND comments.status_id)<>6))

结果:1​​0 条记录(预计 9 条)

trans_id    status_id     com_date
12          1             23-06-2020 16:40:21
13          1             23-06-2020 16:40:26
14          1             23-06-2020 16:40:32
15          1             23-06-2020 16:40:38
15          11            22-06-2020 16:40:38
16          1             23-06-2020 16:40:44
17          1             23-06-2020 16:40:50
18          1             23-06-2020 16:40:56
19          1             23-06-2020 16:41:01
20          1             23-06-2020 16:41:07

SQL

SELECT a.trans_id, a.status_id  
FROM comments a
INNER JOIN
(SELECT b.trans_id, Max(b.com_date) AS com_date
FROM comments b
GROUP BY b.trans_id) c
ON a.trans_id=c.trans_id 
AND a.com_date = c.com_date
WHERE a.status_id<>0 AND a.status_id<>6

结果:7 条记录(预期 9 条)

trans_id    status_id
12          1
13          1
14          1
16          1
17          1
19          1
20          1

【问题讨论】:

标签: sql ms-access


【解决方案1】:

涉及聚合查询的 UPDATE 操作将阻止 UPDATE 操作。将不得不使用替代方法来编辑字段。保存计算数据,尤其是汇总数据,通常是不明智的做法。如果可以为UPDATE计算,那么可以在需要的时候计算,如下图:

SELECT comments.*
FROM comments 
WHERE (((comments.id) In (SELECT TOP 1 ID FROM comments AS Dupe WHERE Dupe.trans_id=comments.trans_id 
    AND Dupe.status_id NOT IN(0,6) ORDER BY Dupe.com_date DESC)));

可以 LEFT JOIN 该查询到交易以显示所有交易记录以及派生的状态代码。

【讨论】:

  • 感谢这个答案,它完美无缺。我现在已将此 SQL 集成到更新查询中并需要设置来标准,但它做得很好!我将把我的最终 SQL 放在下面的回复中。
【解决方案2】:

启用总计的任何查询都将成为不可编辑的查询,因此这会给您带来一些问题。这也说明了为什么您会看到自己的结果。

您的第一个有 10 个结果的查询有 10 个,因为在状态 id 上有一个 Group By 并且 trans_id 15 有一个 1 和 11 的条目导致两条记录都存在。

第二个与内部连接有关,因为唯一省略的记录是具有多个条目的记录。

我执行此更新的方式是编写一个小的 VBA 模块来执行更新,而不是尝试使用查询。

【讨论】:

  • 感谢您的回复。最终,查询是从 VBA 过程中调用的,但我只是想防止在这一点上进行大量编码。
【解决方案3】:

最终的 SQL 现在是:

UPDATE transactions AS upd LEFT JOIN 
(SELECT a.trans_id, a.status_id
FROM comments AS a 
WHERE (((a.id) IN (
SELECT TOP 1 ID FROM comments AS dupe 
WHERE dupe.trans_id=a.trans_id
AND dupe.status_id NOT IN (0,6) ORDER BY dupe.com_date DESC)))) AS b
ON upd.id = b.trans_id SET upd.status_id = b.status_id
WHERE (((b.trans_id) Is Not Null));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多