在ACCESS 2013中使用SELECT MAX进行UPDATE查询

时间:2016-08-26 09:53:34

标签: sql ms-access

我在Access 2013中有以下2个表格

**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% 我为该组定义了2层:

  • 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'

2 个答案:

答案 0 :(得分:0)

试试这个:

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语句的在线示例:https://msdn.microsoft.com/en-us/library/office/aa217680(v=office.11).aspx。这是具体的例子:

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;

遵循这个结构,我能够将您的查询保存在我的访问数据库中,这意味着没有语法错误,所以它应该工作。它只是现在结果的问题以及您希望查询返回的内容。

答案 1 :(得分:0)

我很确定你不能在UPDATE查询中使用聚合函数,而是尝试使用域聚合(未经过完全测试):

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语句的查询(写一个普通的选择查询,删除FROM之前的所有内容并将FROM更改为UPDATE)。