是否可以使用存储在 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 1
有 Table 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]
我想用一个例子来解释会更容易。我有两张这样的桌子。
+----+--------------------------------+---------+
| 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 1
有 Table 2
的匹配行 "criteria" 和 Table 2
中该行的值。我知道我可以使用 VBA 遍历 Table 1
中的每一行,创建可用于更新 Table 2
.
例如,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]