Многополевые отношения в MS Access - PullRequest
0 голосов
/ 06 июля 2018

У меня есть база данных с двумя таблицами, подобными этой:

Магазины:

+----+-------+--------+-------+-----------+
| 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 отображался правильный идентификатор округа, в котором находится магазин. В этом примере это должно быть 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 голосов
/ 06 июля 2018

Этот запрос на обновление будет обновлять только совпадающие записи Stores 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

0 голосов
/ 06 июля 2018

Эта ошибка не ошибка. Скорее, в Access каждая часть запроса Update должна быть обновляемой, даже подзапросы, которые редко бывают.

В дополнение к ответу Пола Т (который должен работать), вы можете использовать следующий код:

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, что может привести к сбою оператора.

0 голосов
/ 06 июля 2018

Эта ошибка может быть вызвана различными причинами.

Попробуйте вместо этого запрос: (У меня нет MS Access на данный момент, но это может сработать)

UPDATE Stores
    INNER JOIN Counties ON Stores.County = Counties.County AND Stores.State = Counties.State
   SET County_ID = Counties.ID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...