Оптимизация SQL-запроса в VBA

Я пытаюсь найти наиболее оптимизированный способ выполнения этой операции, которая запускает оператор SQL в Access-VBA:

SQl = "UPDATE " _
& "MainTable As T1 " _
& "INNER JOIN TableOfLists As T2 " _
& "ON (T2.SecondList = T1.MultiValuedList.value) " _
& "Set [FOUND IN LISTS] = 'YES' "
DoCmd.RunSQL SQl

SQl = "UPDATE " _
& "MainTable As T1 " _
& "INNER JOIN TableOfLists As T2 " _
& "ON (T2.FirstList = T1.MultiValuedList.value) " _
& "Set [FOUND IN LISTS] = 'YES' "
DoCmd.RunSQL SQl

Этот код работает, его можно улучшить, но мне не удалось выяснить, как это сделать.

Что я пробовал до сих пор и результаты, которые я получил:

  1. Добавление 2 INNER JOIN, но я получаю синтаксическую ошибку 3075
  2. Добавление 2 условий, разделенных ИЛИ, в условии INNER JOIN, но я получаю сообщение об ошибке 3081 : нельзя присоединиться более чем к 1 таблице
  3. Это было мое предыдущее решение, использующее 2 оператора SELECT, но вместо этого мне порекомендовали использовать JOIN

Любые предложения приветствуются!


person Seb    schedule 28.02.2017    source источник
comment
Вы имеете в виду On ((T2.SecondList = T1.MultiValuedList.value)) Или (T2.FirstList = T1.MultiValuedList.value) ????   -  person Tony Hopkinson    schedule 28.02.2017
comment
да скобки ничего не меняют   -  person Seb    schedule 28.02.2017
comment
Я имел в виду скобки под скобками   -  person Seb    schedule 28.02.2017
comment
Эх, это был способ сделать это одним оператором обновления...   -  person Tony Hopkinson    schedule 28.02.2017
comment
Access говорит вам, что многозначные поля — это зло. stackoverflow.com/questions/1461582/   -  person Andre    schedule 28.02.2017
comment
я бы преобразовал это в фактический запрос и просто запустил запрос, если только некоторые из объектов, на которые вы ссылаетесь, не создаются динамически. не зная объема и и индексов по вашим таблицам не поможет это прокомментировать   -  person O. Gungor    schedule 28.02.2017


Ответы (1)


Ну вот. Это своего рода способ ANSI SQL, потому что объединения в UPDATE не поддерживаются. (Дополнительные сведения см. в этой записи блога. ) Вот почему вы увидели ошибку в своем первом подходе (с двумя ВНУТРЕННИМИ СОЕДИНЕНИЯМИ, потому что Access/Jet предоставляет вам специальную функцию в их синтаксисе UPDATE, но он не так полностью разработан, как ванильный SQL. Ваш второй подход (с ИЛИ в условии соединения) ошибки, потому что поддержка Access/Jet для условий в критериях соединения очень ограничена (например, вы не увидите этого в Oracle или Postgres).И оказывается, что ваш третий подход (с двумя выборками, но использование IN вместо EXISTS) то же самое, но под капотом Так что тот, кто сказал вам использовать соединения, был плохо информирован :).

UPDATE MainTable SET [FOUND IN LISTS]='YES'
WHERE 
    EXISTS (SELECT 1 FROM TableOfLists WHERE FirstList=MainTable.[value])
    OR
    EXISTS (SELECT 1 FROM TableOfLists WHERE SecondList=MainTable.[value]);

Пример в Access

person Will Jobs    schedule 01.03.2017
comment
Большое спасибо за этот ответ! Именно то, что я искал :) - person Seb; 01.03.2017