我有一个包含两个表的数据库:
商店:
+----+-------+--------+-------+-----------+
| ID | Store | County | State | County_ID |
+----+-------+--------+-------+-----------+
| 21 | Name1 | Who | NV | |
| 32 | Name2 | What | NY | |
| 73 | Name3 | When | MA | |
| 44 | Name4 | Where | FL | |
+----+-------+--------+-------+-----------+
县:
+----+--------+-------+
| ID | County | State |
+----+--------+-------+
| 1 | Who | NV |
| 2 | What | NY |
| 3 | Where | FL |
| 4 | When | MA |
+----+--------+-------+
我希望County_ID字段反映商店所在县的正确ID。在此示例中,它应为1,2,4,3
我尝试使用更新查询来手动更新
UPDATE Stores
SET County_ID = (SELECT Counties.ID FROM Counties
WHERE Stores.County=Counties.County AND Stores.State=Counties.State)
但是我收到错误消息“操作必须使用可更新的查询”,这是Access的一个持续错误。有谁有更好的方法来做到这一点?谢谢!
答案 0 :(得分:3)
该错误可能是由于多种原因造成的。
改为尝试以下查询:(目前我没有MS Access,但这可能有效)
UPDATE Stores
INNER JOIN Counties ON Stores.County = Counties.County AND Stores.State = Counties.State
SET County_ID = Counties.ID
答案 1 :(得分:1)
该错误不是错误。相反,在Access中,Update
查询的每个部分都必须是可更新的,甚至是子查询(很少是子查询)。
除了Paul T的答案(应该起作用)之外,您还可以使用以下代码:
UPDATE Stores
SET County_ID = DLookUp("Counties.ID", "Counties", "Counties.County = '" & Stores.County & "' AND Counties.State = '" & Stores.State & "'")
DLookUp
是一种安全返回SELECT
查询的第一个结果的方式(第一个参数= SELECT
部分,第二个FROM
部分,第三个WHERE
部分)而不会导致更新锁或多个返回值出错。
此方法的主要优点是它不需要对Counties
表进行更新锁定。主要缺点是它通常较慢,并且如果使用字符串字段,则存在SQL注入的风险,这可能会使语句失败。
答案 2 :(得分:0)
此更新查询将仅更新匹配的记录,将Counties.ID存储到Stores.County_ID字段
UPDATE Stores
SET [Stores].[County_ID] = [Counties].[ID]
WHERE (([Stores].[County]=[Counties].[County] And [Stores].[State]=[Counties].[State]));
使用追加查询来添加初始更新后不存在的县 请务必对数据进行规范化处理,以避免由于拼写错误和空格而造成重复
INSERT INTO Counties (County, State)
SELECT DISTINCT Stores.County, Stores.State
FROM Stores
WHERE Stores.County_ID IS NULL;
然后运行更新查询以填写所有County_ID密钥