Access SQL:无法使用 Max() 和 Min() 值更新列表

Posted

技术标签:

【中文标题】Access SQL:无法使用 Max() 和 Min() 值更新列表【英文标题】:Access SQL: Update list with Max() and Min() values not possible 【发布时间】:2019-11-25 07:52:18 【问题描述】:

我有一个日期列表:list_of_dates

我想用这个代码 (#1) 找到每个数字的最大值和最小值。

它应该如何工作,因此我得到了表格 MinMax

现在我想用这些新获得的值 (#2) 更新另一个列表 (list_of_things)。

但是,这是不可能的。 我认为这是由于 DISTINCT 以及我总是得到每个数字两行的事实,每行都有最小值和最大值。因此无法进行更新。 不幸的是,我不知道其他方法。

#1
SELECT a.number, b.MaxDateTime, c.MinDateTime
FROM (list_of_dates AS a 

INNER JOIN (
SELECT a.number, MAX(a.dat) AS MaxDateTime 
FROM list_of_dates AS a 
GROUP BY a.number) AS b 
ON a.number = b.number) 

INNER JOIN (SELECT a.number, MIN(a.dat) AS MinDateTime 
FROM list_of_dates AS a 
GROUP BY a.number) AS c 
ON a.number = c.number;


#2
UPDATE list_of_things AS a 
LEFT JOIN MinMax AS b 
ON a.number = b.number 
SET a.latest = b. MaxDateTime, a.ealiest = b.MinDateTime```


【问题讨论】:

当涉及到不可编辑的查询时,无法完成 UPDATE 操作。有或没有 DISTINCT,句号。聚合查询是不可编辑的数据集。无论如何,保存聚合数据通常是个坏主意。您可以遍历 VBA 中的记录集并使用记录集中的值更新记录。或者将记录保存到“临时”表中,然后在 UPDATE 操作中使用该表。 【参考方案1】:

MS Access update 查询的任何部分都不能包含聚合,否则生成的记录集将变为“不可更新”。

在您的情况下,在 MinMax 子查询中使用 minmax 聚合函数会导致最终的 update 查询变得不可更新。

虽然存储聚合数据并不总是可取的(有利于使用查询从事务数据生成输出),但如果您确实需要这样做,这里有两种可能的方法:

1。使用临时表存储聚合结果

运行select into 查询,如下所示:

select 
    t.number, 
    max(t.dat) as maxdatetime,
    min(t.dat) as mindatetime 
into 
    temptable
from 
    list_of_dates t
group by 
    t.number

要生成一个名为 temptable 的临时表,然后运行以下 update 查询,该查询的日期来自该临时表:

update 
    list_of_things t1 inner join temptable t2
    on t1.number = t2.number
set 
    t1.latest = t2.maxdatetime,
    t1.earliest = t2.mindatetime

2。使用域聚合函数

由于domain aggregate functions(dcountdsumdmindmax 等)与查询的评估分开评估,因此它们不会破坏查询的可更新性质。

因此,您可以考虑使用如下查询:

update 
    list_of_things t1
set 
    t1.latest = dmax("dat","list_of_dates","number = " & t1.number),
    t1.earliest = dmin("dat","list_of_dates","number = " & t1.number)

【讨论】:

【参考方案2】:

这是在黑暗中拍摄,但请尝试按照 SQL Update woes in MS Access - Operation must use an updateable query 添加 DistinctRow

也可以尝试使用内连接。如果需要,可以先将查询中的所有记录更新为空值,以模拟外连接的效果。

【讨论】:

以上是关于Access SQL:无法使用 Max() 和 Min() 值更新列表的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2012 中作为 Varbinary(MAX) 的照片在 Access 2010 中导致错误 502753

如何使用 PHP、SQL 和 Microsoft Access 将另一个表中的 select max 函数和用户输入的变量插入表中?

我无法上传大小为 24000 kb 的 sql 文件

无法使用 SSIS 将 SQL Server varchar(max) 传输到 MySQL 文本

使用 Access 2007 查询向导创建 SQL,仍然无法在 VBA 中运行

无法在 Python 中显示来自 Access 的数据(通过 SQL)