Access SQL:不能使用Max()和Min()值更新列表

问题描述 投票:0回答:2

我有一个日期列表:日期列表

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

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

现在,我想用这些新获取的值(#2)更新其他列表(list_of_things)。

但是,这不可能。我认为这是由于DISTINCT所致,而且我每个数字总是得到两行,每行分别带有最小值和最大值。因此,无法进行更新。不幸的是,我没有其他办法。

list_of_dates MinMax dates sorted

#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```


ms-access
2个回答
0
投票

这是黑暗中的镜头,但是请尝试按DistinctRow添加SQL Update woes in MS Access - Operation must use an updateable query

也尝试使用内部联接。如果需要,可以首先对查询中的所有记录运行更新为null值,以模拟外部联接的效果。


0
投票

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

在您的情况下,在min子查询中使用maxMinMax聚合函数会导致最终的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 functionsdcountdsumdmindmax等)是与查询的评估分开评估的,因此它们不会破坏查询的可更新性。

因此,您可能考虑使用查询,例如:

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)
© www.soinside.com 2019 - 2024. All rights reserved.