MS-Access选择小于当前值匹配条件的最大值

时间:2017-12-26 18:01:25

标签: sql ms-access jet

我的情况是我有一张简化后的表格,如下所示:

Sort| IsHeader
1   | 0
2   | 0
3   | 1
4   | 0
5   | 0
6   | 1
7   | 0
8   | 0
9   | 0

我正在尝试进行一个查询,为每个明细行更新一个新的HeaderSort行,以显示该行所属的标题,结果如下:

Sort| IsHeader| HeaderSort
1   |  0      | 0
2   |  0      | 0
3   |  1      | 3
4   |  0      | 3
5   |  0      | 3
6   |  1      | 6
7   |  0      | 6
8   |  0      | 6
9   |  0      | 6

在T-SQL中,我可以很容易地做到:

update MT set HeaderSort = 
(
    select isnull(max(Sort),0) from MyTable where Sort <= MT.Sort and IsHeader = 1
)  as HeaderSort 
from MyTable MT

我对访问版本的尝试如下:

Update MyTable set HeaderSort =
(
    select nz(max(Sort),0) from MyTable where Sort <= MT.Sort and IsHeader = 1
)

然而,这给出了“操作必须使用可更新的查询”。错误。 我在获取值的逻辑中是错误,还是只是一些ms-access语法?

1 个答案:

答案 0 :(得分:1)

操作必须使用可更新查询。是在更新语句中引用的所有表都不可更新时遇到的一般错误。不幸的是,子查询很少。

您可以使用DLookup而不是子查询来解决错误:

Update MyTable set HeaderSort = DLookUp("nz(max(Sort),0)", "MyTable", "Sort <= " & MyTable.Sort & " and IsHeader = 1")