Что не так с моим синтаксисом SQL для ОБНОВЛЕНИЯ с JOIN? - PullRequest
2 голосов
/ 19 марта 2010

У меня есть две таблицы, связанные общим ключом. Таким образом, TableA имеет ключ AID и значение Name, а TableB имеет ключи AID, BID и значения Name, Value:

AID Name
74  Alpha

AID BID Name  Value
74  4   Beta  Brilliance

Я бы хотел обновить значение TableB здесь с Brilliance до Barmy, используя только поля Name. Я думал, что смогу сделать это с помощью UPDATE, содержащего JOIN, но Access (я знаю ...) жалуется: «Синтаксическая ошибка (отсутствует оператор) в выражении запроса», а затем все из «Barmy» здесь:

UPDATE tB
SET tB.Value='Barmy'
FROM `TableB` tB
INNER JOIN `TableA` tA
  ON tB.AID=tA.AID
WHERE tB.Name='Beta'
  AND tA.Name='Alpha';

В чем мое отвратительное преступление? Или это просто Access не соответствует?

Ответы [ 6 ]

4 голосов
/ 19 марта 2010

Как ни странно, я обнаружил, что ответ заключается в использовании неявного JOIN:

UPDATE `TableA`, `TableB` 
 SET `TableB`.Value = 'Barmy'
WHERE `TableA`.AID=`TableB`.AID
 AND `TableA`.Name='Alpha'
 AND `TableB`.Name='Beta';
1 голос
/ 19 марта 2010

Я считаю, основываясь на тесте:

UPDATE TableB tB
INNER JOIN TableA tA
  ON tB.AID=tA.AID
SET tB.Value='Barmy'
WHERE tB.Name='Beta'
  AND tA.Name='Alpha';
1 голос
/ 19 марта 2010

Я должен быть честным, я не касался ДОСТУПА в течение многих лет (к счастью) эта тема , кажется, предполагает, что это правильный синтаксис.

UPDATE TableB tB
SET tB.BValue='Barmy'
INNER JOIN TableA tA
  ON tB.AID=tA.AID
WHERE tB.Name='Beta'
  AND tA.Name='Alpha';
0 голосов
/ 19 марта 2010

Доступны ли в Access подзапросы?

UPDATE TableB
SET TableB.Value='Barmy'
WHERE TableB.AID = (SELECT TableA.AID WHERE TableA.Name='Alpha')
0 голосов
/ 19 марта 2010

может не знать, что такое ТБ, пока вы не получите псевдоним в строке FROM. Попробуйте UPDATE TableB ....

0 голосов
/ 19 марта 2010

Одним из решений является запись в Hoyle ANSI (который не распознает предложение FROM в операторе UPDATE):

UPDATE TableB
SET BValue="Barmy"
Where Name="Beta"
    And Exists( Select 1 
                From TableA As TA 
                Where TA.Name = "Alpha"
                    And TA.AID = TableB.AID );

Последнее добавление: Access обрабатывает JOINS в операторе UPDATE, помещая их в предложение UPDATE следующим образом:

UPDATE TableB
    INNER JOIN TableA tA
        ON TableB.AID=tA.AID    
SET TableB.BValue="Barmy"
WHERE TableB.Name="Beta"
  AND tA.Name="Alpha";

РЕДАКТИРОВАТЬ Еще один элемент, Access использует двойные кавычки для идентификации строк, а не одинарные кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...