在Access中运行更新查询时出现问题

时间:2018-10-01 08:06:39

标签: sql ms-access

我有一个关系访问数据库,我想基于另一个表更新一个表。您可以在图片Query Picture中看到关系。 SQL语句如下。尝试更新时,我会遇到“您的查询未将指定的表达式“ TRX900”作为聚合函数的一部分。”

但是当我尝试在数据表查看模式下查看时,就可以了。感谢您的支持。

Update
  (
    (
        Sites INNER JOIN Cells ON Sites.ID = Cells.SiteID
    ) INNER JOIN Cells_2G ON Cells.ID = Cells_2G.[Cell ID] 
  ) ,
  ImportedTRX INNER JOIN ActiveStatus ON ImportedTRX.[Active Status] = ActiveStatus.Status
Set
  Cells_2G.TRX900=Sum( IIF ( ImportedTRX.Frequency <=124 , 1,0 )  )
  , 
  Cells_2G.TRX1800=Sum( IIF ( ImportedTRX.Frequency >=512 , 1,0 )  )
WHERE 
  (
    ImportedTRX.[cell name]=[Sites].[SiteID] & [Cells].[Cell_Order]
    AND 
    ActiveStatus.YesNo=True
  )
;

站点表格示例:

-----------------------
|    ID      | SiteID |
-----------------------
|     1      | T4000X |
-----------------------

单元格表示例:

------------------------------------
|    ID      | SiteID | Cell_Order |
------------------------------------
|     1      |    1   | A          |
|     2      |    1   | B          |
|     3      |    1   | C          |
------------------------------------

Cell_2G样本表:

------------------------------------------------------------
|    ID      | CellID | Expected TRX900 | Expected TRX1800 |
------------------------------------------------------------
|     1      |    1   |        1        |        2         |
|     2      |    2   |        2        |        1         |
|     3      |    3   |        2        |        3         |
------------------------------------------------------------

导入的TRX表示例

-------------------------
| Cell Name | Frequency |
-------------------------
|  T4000XA  | 800       |
|  T4000XA  | 801       |
|  T4000XA  | 22        |
|  T4000XB  | 4         |
|  T4000XB  | 33        |
|  T4000XB  | 860       |
|  T4000XC  | 20        |
|  T4000XC  | 21        |
|  T4000XC  | 840       |
|  T4000XC  | 841       |
|  T4000XC  | 842       |
-------------------------

2 个答案:

答案 0 :(得分:1)

有两种方法可以解决此问题:

  1. 创建2个查询,其中1个准备结果,1个执行更新,其中
  2. 使用VBA进行解析。

我将分享第二种方法。

第一个查询本质上是将当前查询转换为SELECT查询,只有要更新的表已被删除

查询Query1:

SELECT
  Sum( IIF ( ImportedTRX.Frequency <=124 , 1,0 )  ) As TRX900
  , 
  Sum( IIF ( ImportedTRX.Frequency >=512 , 1,0 )  ) As TRX1800,
  Cells.ID

FROM
    (
        Sites INNER JOIN Cells ON Sites.ID = Cells.SiteID
    ),
  ImportedTRX INNER JOIN ActiveStatus ON ImportedTRX.[Active Status] = ActiveStatus.Status
WHERE 
  (
    ImportedTRX.[cell name]=[Sites].[SiteID] & [Cells].[Cell_Order]
    AND 
    ActiveStatus.YesNo=True
  )
GROUP BY
  Cells.ID
;

然后,我们将使用DLookUp更新表并从该查询中进行查询:

查询Query2:

UPDATE Cells_2G 
SET
Cells_2G.TRX900= DLookUp("TRX900", "Query1", "ID = " & [Cell ID]),
Cells_2G.TRX1800= DLookUp("TRX1800", "Query1", "ID = " & [Cell ID])

尽管您没有包括ActiveStatus表,所以我不能在测试中包括它,但这会产生期望的结果。

不幸的是,该语句对于我来说太复杂了,无法写入单个更新查询中,因此,这种两步方法是我可以提出的最佳非VBA解决方案。

答案 1 :(得分:0)

尝试一下之后,我使用了以下代码,但速度很慢。

UPDATE 
  ImportedTRX, 
  (
    Sites INNER JOIN Cells ON Sites.ID=Cells.SiteID
  ) INNER JOIN Cells_2G ON Cells.ID= cells_2G.[Cell ID] 
SET 
  Cells_2G.TRX900 = DSUM("IIF(Frequency<=124,1,0)", "ImportedTRX", "[Cell Name]='"& Sites.SiteID & Cells.Cell_Order & "'")
  , 
  Cells_2G.TRX1800 = DSUM("IIF(Frequency>=512,1,0)", "ImportedTRX", "[Cell Name]='"& Sites.SiteID & Cells.Cell_Order & "'")
WHERE 
  (
    ImportedTRX.[Cell Name]=Sites.[SiteID] & Cells.[Cell_Order]
  );