2012-01-30 6 views
4

У меня проблема с доступом к UPDATE на основе JOIN.Как вставить INSERT с помощью SELECT в таблицу и запрос

Есть 2 Заявление, которое мне нужно объединить:

SELECT a.f1, a.f2, a.f3 
    FROM tableA a, viewB b 
    WHERE a.f2 = b.f2 AND a.f3 = b.f3 

viewB является запрос, но работает отлично

UPDATE tableA a 
    SET a.f1 = 'x' 

работает хорошо, тоже.

Сейчас я стараюсь:

UPDATE tableA a, viewB b 
    SET a.f1 = 'x' 
    WHERE a.f2 = b.f2 AND a.f3 = b.f3 

терпит неудачу, говорит Access:

операции должен использоваться обновляемый запрос.

Это глупо, потому что в поле зрения нет поля. Я пробовал несколько других решений с помощью FROM, JOIN Subselect, но не нашел решения.

Кто-нибудь знает умное решение?

ответ

5

Попробуйте update .. join синтаксис:

update tableA a 
inner join viewB b on a.f2 = b.f2 and a.f3 = b.f3 
set a.f1 = 'x' 

Или в качестве альтернативы:

update tableA a 
set a.f1 = 'x' 
where exists (select * from viewB b where a.f2 = b.f2 and a.f3 = b.f3) 
3

Используйте синтаксис объединения, а не где синтаксис для того, чтобы присоединиться к таблицам:

UPDATE tableA AS a 
INNER JOIN viewB AS b 
    ON (a.f2 = b.f2) AND (a.f3 = b.f3) 
SET a.f1 = 'x'; 

Также обратите внимание, что он будет работать, только если viewB обновляется. Если у viewB есть GROUP BY или UNION, например, он не будет обновляться.


EDIT: Если viewB не обновляемый подзапроса вместо объединения поможет:

UPDATE tableA AS a 
SET a.f1 = 'x' 
WHERE EXISTS (SELECT * 
       FROM viewB AS b 
       WHERE (a.f2=b.f2) AND (a.f3=b.f3)) 
+0

Оливье, спасибо. Именно в этом и есть проблема. viewB НЕ обновляется, потому что он использует DISTINCT, но если вы посмотрите на мой код, я не хочу ничего обновлять с помощью viewB, но мне нужно найти мои записи для обновления. Есть идеи? – Alex004

+0

В этом случае вы можете использовать подзапрос (как уже указывал Andomar): 'UPDATE tableA AS a SET a.f1 = 'x' WHERE EXISTS (SELECT * FROM viewB AS b WHERE (a.f2 = b.f2) AND (a.f3 = b.f3)). См. Мое редактирование. –

+0

Нет, это не работает: подзапрос работает корректно, но UPDATE работает на ВСЕХ записях: мне кажется, что верхний запрос и подзапрос неправильно подключены. – Alex004

0
UPDATE tableA 
    SET a.f1 = 'x' 
    from tableA a, viewB b 
    WHERE a.f2 = b.f2 AND a.f3 = b.f3 
0

Иногда, когда доступ говорит, что вы не создаете обновляемый запрос, он отвечает присвоив свойству в запросе «уникальные записи» на «да».

Смежные вопросы