Sql 在ACCESS 2013中使用SELECT MAX更新查询
我在Access 2013中有以下两个表Sql 在ACCESS 2013中使用SELECT MAX更新查询,sql,ms-access,Sql,Ms Access,我在Access 2013中有以下两个表 **tbl_GroupInvoices** CustomerName | CountryCode | Group | UsageRate | SelectedTier | ------------ | ----------- | ----- | --------- | ------------ | CUST1 | FR | GROUP1 | | 0
**tbl_GroupInvoices**
CustomerName | CountryCode | Group | UsageRate | SelectedTier |
------------ | ----------- | ----- | --------- | ------------ |
CUST1 | FR | GROUP1 | | 0 |
CUST1 | FR | GROUP2 | 8.40% | 0 |
CUST1 | FR | GROUP3 | 47.91% | 0 |
CUST1 | FR | GROUP4 | 89.53% | 0 |
CUST1 | FR | GROUP5 | 45.34% | 0 |
tbl_GenericTiers
CustomerName | CountryCode | TierName | UsageRate
------------ | ----------- | -------- | --------- |
CUST1 | FR | GROUP1 | 20 |
CUST1 | FR | GROUP1 | 40 |
CUST1 | FR | GROUP1 | 60 |
CUST1 | FR | GROUP1 | 80 |
CUST1 | FR | GROUP2 | 20 |
CUST1 | FR | GROUP2 | 40 |
CUST1 | FR | GROUP2 | 60 |
CUST1 | FR | GROUP2 | 80 |
我需要从tbl_GenericTiers确定表tbl_GroupInvoices上选择的层,
通过查看tbl_GroupInvoices中的组的实际使用率并选择层,了解已选择层
包含使用率的
e、 g。
如果使用率=45.6%
我为集团定义了两层:
1:40%
1,60%
我需要选择第40层%
如果使用率为64.3%,则我选择60%层
我的SQL查询如下所示:
UPDATE tbl_GroupInvoices
SET tbl_GroupInvoices.SelectedTier = TmpTable.MaxUsageRate
FROM (
SELECT MAX(tbl_GenericTiers.UsageRate) AS MaxUsageRate
FROM tbl_GroupInvoices, tbl_GenericTiers
WHERE tbl_GroupInvoices.CustomerName = tbl_GenericTiers.CustomerName
AND tbl_GroupInvoices.CountryCode = tbl_GenericTiers.CountryCode
AND tbl_GroupInvoices.[Group] = tbl_GenericTiers.TierName
AND tbl_GroupInvoices.UsageRate >= tbl_GenericTiers.UsageRate) AS TmpTable
我一直收到以下错误消息:
Syntax error (missing operator) in query expression 'TmpTable.MaxUsageRate
FROM (
SELECT MAX(tbl_GenericTiers.UsageRate) AS MaxUsageRate
FROM tbl_GroupInvoices, tbl_GenericTiers
WHERE tbl_GroupInvoices.CustomerName = tbl_GenericTiers.CustomerName
AND tbl_GroupInvoices.CountryCode = tbl_GenericTiers.CountryCode
AND tbl_GroupInvoices.[Group] = tbl_GenericTiers.TierName
AND tbl_GroupInvoices.UsageRate >= tbl_GenericTiers.UsageRate) AS TmpTable'
试试这个:
UPDATE tbl_GroupInvoices
SET tbl_GroupInvoices.SelectedTier = (
SELECT MAX(tbl_GenericTiers.UsageRate) AS MaxUsageRate
FROM tbl_GroupInvoices, tbl_GenericTiers
WHERE tbl_GroupInvoices.CustomerName = tbl_GenericTiers.CustomerName
AND tbl_GroupInvoices.CountryCode = tbl_GenericTiers.CountryCode
AND tbl_GroupInvoices.[Group] = tbl_GenericTiers.TierName
AND tbl_GroupInvoices.UsageRate >=UsageRate);
不同的是,我没有将嵌套的SELECT语句放在FROM中。相反,我把它放在平等的另一边。我认为这是正确的,因为我在这里在线找到了嵌套SELECT语句的示例:。这就是一个具体的例子:
SELECT Orders.CustomerID, Orders.OrderDate,
(SELECT MAX(OrderDate)
FROM Orders AS Orders1
WHERE Orders1.OrderDate < Orders.OrderDate
AND Orders1.CustomerID = Orders.CustomerID)
AS PreviousOrderDate,
[OrderDate]-[PreviousOrderDate] AS OrderInterval
FROM Orders
ORDER BY Orders.CustomerID, Orders.OrderDate DESC;
按照这种结构,我可以将您的查询保存在我的access数据库中,这意味着没有语法错误,因此应该可以正常工作。现在的问题只是结果和您希望查询返回的内容。我很确定您不能在更新查询中使用聚合函数,请尝试使用未经完全测试的域聚合:
UPDATE tbl_GroupInvoices GI INNER JOIN tbl_GenericTiers GT ON GI.CustomerName = GT.CustomerName AND
GI.CountryCode = GT.CountryCode AND
GI.[Group] = GT.TierName AND
GI.UsageRate = GT.UsageRate
SET GI.SelectedTier = DMAX("UsageRate", "tbl_GenericTiers", "CustomerName = '" & GI.CustomerName & "' AND
CountryCode = '" & GI.CountryCode & "' AND
TierName = '" & GI.[Group] & "'")
编辑:在Access中设置值之前,首先列出表联接-基本上是没有SELECT字段或FROM语句的查询。编写一个普通的SELECT查询,删除FROM之前的所有内容,并将FROM更改为UPDATE。非常感谢。看起来还可以,但我仍然收到“操作必须使用可更新的查询”消息。