2017-02-28 3 views
0

Je suis en train de trouver la façon la plus optimisée pour effectuer cette opération qui exécute une instruction SQL dans Access-VBA:Optimize requête SQL dans 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 

Ce code fonctionne, peut être amélioré sûrement, mais je didn n'arrive pas à savoir comment.

Ce que j'ai essayé à ce jour et les résultats que je suis:

  1. Adding 2 INNER JOIN mais je reçois une erreur de syntaxe 3075
  2. Adding 2 conditions separated by an OR in the INNER JOIN condition mais je reçois une erreur 3081: ne peut pas joindre plus de 1 Table
  3. This was my previous solution using 2 SELECT statements mais je suis recommandé d'utiliser JOIN à la place

Toutes les suggestions sont les bienvenues!

+0

voulez-vous dire sur ((T2.SecondList = T1.MultiValuedList.value)) ou (T2.FirstList = T1.MultiValuedList.value) ???? –

+0

Oui, les parenthèses ne font aucune différence – Seb

+0

Je voulais dire "parenthèses" par "parenthèses" – Seb

Répondre

3

C'est parti. C'est un peu la manière de faire les choses dans l'ANSI SQL, car les jointures dans une UPDATE ne sont pas supportées. (Voir this blog entry pour plus de détails.) C'est pourquoi vous avez vu une erreur dans votre première approche (avec deux INNER JOINs, car Access/Jet vous donne une fonctionnalité spéciale dans leur syntaxe UPDATE, mais elle n'est pas aussi développée que SQL Votre deuxième approche (avec un OR dans la condition de jointure) est erronée car la prise en charge par Access/Jet des conditions dans les critères de jointure est très limitée (vous ne le verrez pas dans Oracle ou Postgres, par exemple). la troisième approche (avec deux sélections, mais en utilisant IN au lieu de EXISTS) est la même, sous le capot, donc celui qui vous a dit d'utiliser les jointures était mal informé :).

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]); 

Example in Access

+0

Merci beaucoup pour cette réponse! Exactement ce que je cherchais :) – Seb