是否可以使用存储在 table 中的 WHERE 条件在 MS Access 中的另一个 table 中进行更新

is it possible to use WHERE criteria stored in a table to make updates in another table in MS Access

我想用一个例子来解释会更容易。我有两张这样的桌子。

+----+--------------------------------+---------+
|                    Table 1                    |
+----+--------------------------------+---------+
| ID |            criteria            |  value  |
+----+--------------------------------+---------+
|  1 | [Table 2].[name] like "dingo*" | alpha   |
|  2 | [Table 2].[location] = "here"  | bravo   |
|  3 | [Table 2].[active] = TRUE      | charlie |
+----+--------------------------------+---------+

+----+-------------+----------+--------+-------+
|                   Table 2                    |
+----+-------------+----------+--------+-------+
| ID |    name     | location | active | value |
+----+-------------+----------+--------+-------+
|  1 | dingo bingo | there    | FALSE  |       |
|  2 | bob         | here     | FALSE  |       |
|  3 | bingo       | there    | TRUE   |       |
|  4 | bingo bob   | here     | FALSE  |       |
+----+-------------+----------+--------+-------+

Table 1Table 2 的匹配行 "criteria" 和 Table 2 中该行的值。我知道我可以使用 VBA 遍历 Table 1 中的每一行,创建可用于更新 Table 2.

的 SQL 更新字符串

例如,Table 1 中第一行的 SQL 是:

UPDATE [Table 2]
SET [Table 2].[value] = "alpha"
WHERE [Table 2].[name] like "dingo*"

结果是:

+----+-------------+----------+--------+-------+
|                   Table 2                    |
+----+-------------+----------+--------+-------+
| ID |    name     | location | active | value |
+----+-------------+----------+--------+-------+
|  1 | dingo bingo | there    | FALSE  | alpha |
|  2 | bob         | here     | FALSE  |       |
|  3 | bingo       | there    | TRUE   |       |
|  4 | bingo bob   | here     | FALSE  |       |
+----+-------------+----------+--------+-------+

但我想知道是否有一种方法可以使用单个查询来执行此操作,而不必遍历 Table 1 中的每一行。

如果重要,保证Table 1中的标准没有重叠。换句话说,如果 Table 1 的 ID 1 与 Table 2 中的 ID 1 匹配,则 Table 1 中的其他行都不会与 Table 2 中的 ID 1 匹配。

是的,您可以查看更新中的其他表。但看起来您正在数据中存储 SQL 表达式,不幸的是您将无法将它们用作更大查询的一部分。

您可能会以可从查询中使用的方式对过滤器进行编码,但它看起来不像自由格式 SQL。另一种方法是查看动态 SQL 并即时构建查询字符串。当然,这需要 VBA.

不,没有VBA是不可能的。

允许这样做会破坏 space 时间连续体或至少导致口齿不清。

但无需手动遍历每条记录也是可以的。

编写一个 public 函数,接受 sql 字段作为参数,并使用它们来构建和执行 sql 语句。我不确定它是否可取,但它不太可能破坏 space-时间连续体。

Public Function RunTableSQL(ByVal sValue As String, ByVal sCriteria As String) As Long

    Dim sSQL As String

    On Error GoTo EH
    sSQL = "UPDATE [Table 2] SET [Table 2].[value] = "" & sValue & "" _
        & "WHERE " & sCriteria
    CurrentDb.Execute sSQL        
    RunTableSQL = 0

    Exit Function
EH:
    RunTableSQL = Err.Number
    Err.Clear
End Function

和 运行 为每一行创建这样的查询:

SELECT *,RunTableSQL([value],[criteria]) AS Result FROM [Table 1]