【问题标题】:How do I delete all NA value from my ACCESS Table?如何从我的 ACCESS 表中删除所有 NA 值?
【发布时间】:2021-12-24 16:01:48
【问题描述】:

是否存在类似以下的查询:

UPDATE FieldName FROM TableName WHERE FieldName IN('NA') SET FieldName = NULL

事实上FieldName 可以是任何字段?

举例

Field1 Field2 Field3 Field4 .... Field100
013475 486466 486655 156861 .... 15351312
013475 NA 486655 156861 .... 15351312
013475 486466 NA 156861 .... NA
013475 486466 486655 NA .... NA

执行查询后我应该有:

Field1 Field2 Field3 Field4 .... Field100
013475 486466 486655 156861 .... 15351312
013475 486655 156861 .... 15351312
013475 486466 156861 ....
013475 486466 486655 ....

请注意,我正在处理访问权限。

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    必须明确引用要更新的每个字段。

    考虑具有 2 个字段的示例:

    UPDATE tablename SET Field2 = IIf(Field2 = "NA", Null, Field2),
                         Field3 = IIf(Field3 = "NA", Null, Field3)
    

    或者,构建 VBA 过程以对记录集执行编辑或在循环中运行重复的 UPDATE 操作语句。

    否则,打开表并在整个表上运行一次性查找/替换。

    【讨论】:

      【解决方案2】:

      没有。 SQL 中的字段名和表名不能是动态的。

      DAO 用于此类任务:

      Public Function CleanNa()
      
          Dim Records As DAO.Recordset
          Dim Field   As DAO.Field
          
          Dim Sql     As String
          
          Sql = "Select * From Tablename"
          
          Set Records = CurrentDb.OpenRecordset(Sql)
          
          Records.MoveFirst
          While Not Records.EOF
              For Each Field In Records.Fields
                  If Field.Value = "NA" Then
                      Records.Edit
                      Field.Value = Null
                      Records.Update
                  End If
              Next
              Records.MoveNext
          Wend
          Records.Close
          
      End Function
      

      【讨论】:

      • 好了,你已经准备好运行代码了。它的运行速度可能比开始编写一系列相同的 SQL 更新要快得多。
      【解决方案3】:

      您可以做的一件事是使用一些 VBA 循环字段并运行一组更新语句。比如:

      Sub sUpdateData()
          Dim db As DAO.Database
          Dim tdf As DAO.TableDef
          Dim fld As DAO.Field
          Dim strSQL As String
          Set db = CurrentDb
          Set tdf = db.TableDefs("TableName")
          For Each fld In tdf.Fields
              strSQL = "UPDATE TableName SET [" & fld.Name & "]=NULL WHERE [" & fld.Name & "]='NA';"
              db.Execute strSQL
          Next fld
          Set tdf = Nothing
          Set db = Nothing
      End Sub
      

      【讨论】:

      • 我认为你的方式是最快的
      • 这绝对是最慢的方法,因为您将为每次点击运行不必要的更新查询。
      • @Gustav 但循环记录集和每个字段以单独检查每条数据可能会更慢?只有适当的基准测试才能说明问题,而且它还可能取决于需要更新的数据条数。
      • @Applecore:此方法将调用 100 个更新查询。它永远不会很快。但你当然是对的——谁知道呢?您需要统计数据才能猜测。
      • @Gustav 需要检查 4Mios 细胞
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-08
      • 1970-01-01
      • 2022-01-11
      • 2018-10-21
      • 2018-01-04
      • 1970-01-01
      相关资源
      最近更新 更多