2017-02-28 1 views
0

Ich versuche, den am besten optimierten Weg zu finden, um diesen Vorgang zu tun, die eine SQL-Anweisung in läuft Zugriff-VBA:Optimieren von SQL-Abfrage in 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 

Dieser Code funktioniert, kann sicher verbessert werden, aber ich didn Es gelingt mir nicht, herauszufinden, wie.

Was ich bisher versucht, und die Ergebnisse, die ich bekam:

  1. Adding 2 INNER JOIN aber ich bekomme einen Syntaxfehler 3075
  2. Adding 2 conditions separated by an OR in the INNER JOIN condition aber ich erhalte eine Fehlermeldung 3081: kann nicht mehr als 1 beitreten Tisch
  3. This was my previous solution using 2 SELECT statements aber ich wurde empfohlen, stattdessen JOIN zu verwenden

Irgendwelche Vorschläge willkommen!

+0

meinen Sie On ((T2.SecondList = T1.MultiValuedList.value)) oder (T2.FirstList = T1.MultiValuedList.value) ???? –

+0

Ja, Klammern machen keinen Unterschied – Seb

+0

Ich meinte "Klammern" mit "Klammern" – Seb

Antwort

3

Hier gehen Sie. Dies ist eine Art der ANSI SQL-Vorgehensweise, da Joins innerhalb eines UPDATE nicht unterstützt werden. (Siehe hierzu this blog entry für weitere Details.) Deshalb haben Sie bei Ihrem ersten Ansatz (mit zwei INNER JOINs) einen Fehler gesehen, weil Access/Jet Ihnen eine spezielle Funktion in ihrer UPDATE-Syntax bietet, aber nicht so ausgereift ist wie Vanilla SQL Ihr zweiter Ansatz (mit einem OR in der Join-Bedingung) führt zu Fehlern, da die Unterstützung von Access/Jet für Bedingungen in Join-Kriterien sehr begrenzt ist (Sie würden dies beispielsweise in Oracle oder Postgres nicht sehen) Der dritte Ansatz (mit zwei Auswahlmöglichkeiten, aber mit IN anstelle von EXISTS) ist unter der Haube gleich, also wer immer dir gesagt hat, dass du Joins verwenden sollst, war schlecht informiert :).

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

Vielen Dank für diese Antwort! Genau das, was ich gesucht habe :) – Seb