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

Sql 在access中运行更新查询时出现问题,sql,ms-access,Sql,Ms Access,我有一个关系access数据库,我想基于另一个表更新一个表。你可以在图中看到关系。SQL语句如下所示。当我尝试更新I face时,“您的查询不包括作为聚合函数一部分的指定表达式“TRX900” 但当我尝试在数据表视图模式下查看时,它是正常的。感谢您的支持 Update ( ( Sites INNER JOIN Cells ON Sites.ID = Cells.SiteID ) INNER JOIN Cells_2G ON Cells.ID = Cells_2

我有一个关系access数据库,我想基于另一个表更新一个表。你可以在图中看到关系。SQL语句如下所示。当我尝试更新I face时,“您的查询不包括作为聚合函数一部分的指定表达式“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个查询,1个准备结果,1个执行更新,其中
  • 使用VBA解析
  • 我将分享第二种方法

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

    查询查询1:

    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
    ;
    
    UPDATE Cells_2G 
    SET
    Cells_2G.TRX900= DLookUp("TRX900", "Query1", "ID = " & [Cell ID]),
    Cells_2G.TRX1800= DLookUp("TRX1800", "Query1", "ID = " & [Cell ID])
    
    这会产生所需的结果,尽管您没有包括
    ActiveStatus
    表,所以我不能在测试中包括它


    不幸的是,该语句太复杂,我无法将其写入单个更新查询中,因此这种两步方法是我能想到的最好的非VBA解决方案。

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

    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]
      );
    
    更新
    进口TRX,
    (
    站点内部连接站点上的单元格。ID=Cells.SiteID
    )单元格上的内部连接单元格。\u 2G。ID=单元格。\u 2G。[单元格ID]
    设置
    Cells_2G.TRX900=DSUM(“IIF(频率=512,1,0)”,“ImportedTRX”,“[Cell Name]=”,“&Sites.SiteID&Cells.Cell_顺序&“”)
    哪里
    (
    ImportedTRX。[单元名称]=站点。[站点ID]&单元。[单元顺序]
    );
    
    您无法使此查询正常工作。您可以通过在底部添加
    GROUP by TRX900、TRX1800
    来避免此问题,但随后会出现错误,因为您的记录集不可更新,这是主要问题。为了避免这种情况,您必须重写整个查询以使用域聚合而不是联接,并且如果没有样本数据和预期输出,我们无法为您这样做。谢谢Erik。我在下面的路径中添加了一个小示例:同时,我在“Cells_2G”表中添加了两个名为“Expected TRX900”和“Expected TRX1800”的列作为预期结果。谢谢你的帮助。我的建议是在“导入TRX”表的基础上更新“Cells_2G”表。我想计算每个对应单元格的频率。\u 2G记录抱歉,我没有从不可信的来源下载Access数据库。请参阅,了解如何在SO上共享表格。亲爱的Erik。我确实编辑了我的问题,并添加了示例表。非常感谢Erik,您的提示和支持,帮助了我很多。我将在VBA中使用sql。但是,您提到的解决方案需要在我的数据库中运行很多时间。经过一些尝试,我发现了一个运行更快的查询解决方案,我想与大家分享。但我不知道如何在评论中分享。我应该回答我的问题吗?如果它解决了你的问题,你可以分享它作为一个答案。如果你想问更多关于它的问题,你可以问一个新问题,如果你的问题没有实质性的改变,也可以把它编辑成你的问题。