sql - Access SQL 根据条件从组中选择最新记录

标签 sql ms-access

我在 MS Access 2016 x64 中有两个表。我想用表注释(字段status_id)的查询结果更新表transactions中的字段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

最佳答案

涉及聚合查询的 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 - Access SQL 根据条件从组中选择最新记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62585084/

相关文章:

sql - 查找一个表中不存在于另一表中的记录

sql - 在 SQL Server 2016 中将Where IN 与 STRING_SPLIT 和聚合计数结合使用

sql - Access 2010 SQL Query 仅在完整单词的字符串中查找部分匹配

sql - Access : getting create table string

sql - 在 MS Access 2007 中使用 SQL 用户定义函数

SQL 行到列

mysql - 有没有单独的sql语句可以进行批量更新?

ms-access - 在Access中,IIf函数的 "falsepart"是否是必需的?

sql - 操作必须使用可更新的查询 ASP 查询失败

c# - Windows 搜索查询文件内容中单词/子字符串的*部分*