MS Access中的多字段关系

时间:2018-07-06 00:11:04

标签: sql ms-access

我有一个包含两个表的数据库:

商店:

+----+-------+--------+-------+-----------+
| 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的一个持续错误。有谁有更好的方法来做到这一点?谢谢!

3 个答案:

答案 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密钥