Ho scritto su alcuni degli limitations of correlated subqueries in Access/JET SQL qualche istante indietro e ho annotato la sintassi per l'unione di più tabelle per gli UPDATE SQL. Sulla base di queste informazioni e alcuni test rapidi, non credo che ci sia un modo per fare ciò che vuoi con Access/JET in una singola istruzione SQL UPDATE. Se si potesse, la dichiarazione dovrebbe leggere qualcosa di simile:
UPDATE FUNCTIONS A
INNER JOIN (
SELECT AA.Func_ID, Min(BB.Tax_Code) AS MinOfTax_Code
FROM TAX BB, FUNCTIONS AA
WHERE AA.Func_Pure<=BB.Tax_ToPrice AND AA.Func_Year= BB.Tax_Year
GROUP BY AA.Func_ID
) B
ON B.Func_ID = A.Func_ID
SET A.Func_TaxRef = B.MinOfTax_Code
In alternativa, Accesso/JET a volte consente di ottenere via con il salvataggio di una subquery come una query separata e poi unirlo nell'istruzione UPDATE in un più tradizionale modo. Così, per esempio, se abbiamo salvato la subquery seleziona sopra come una query separata denominata FUNCTIONS_TAX, quindi l'istruzione UPDATE sarebbe:
UPDATE FUNCTIONS
INNER JOIN FUNCTIONS_TAX
ON FUNCTIONS.Func_ID = FUNCTIONS_TAX.Func_ID
SET FUNCTIONS.Func_TaxRef = FUNCTIONS_TAX.MinOfTax_Code
Tuttavia, questo ancora non funziona.
Credo che l'unico modo per farlo funzionare sia spostare la selezione e l'aggregazione del valore Tax_Code minimo out-of-band. È possibile farlo con una funzione VBA o più facilmente utilizzando la funzione Access DLookup. Salvare il GROUP BY subquery sopra per una query denominata FUNCTIONS_TAX separata e riscrivere l'istruzione UPDATE come:
UPDATE FUNCTIONS
SET Func_TaxRef = DLookup(
"MinOfTax_Code",
"FUNCTIONS_TAX",
"Func_ID = '" & Func_ID & "'"
)
Si noti che la funzione DLookup impedisce questa query venga utilizzato al di fuori di accesso, per esempio tramite JET OLE DB. Inoltre, le prestazioni di questo approccio possono essere piuttosto terribili a seconda del numero di righe a cui sei indirizzato, poiché la sottoquery viene eseguita per ogni riga FUNCTIONS (perché, ovviamente, non è più correlata, ovvero l'intero punto in ordine per farlo funzionare).
Buona fortuna!
In genere è possibile trasformare una query SELECT in una query UPDATE con il clic di un pulsante in Progettazione query di Access - è presente un pulsante "tipo query" nella barra dei comandi, quando non si è in visualizzazione SQL. Provalo, si prende cura di qualsiasi requisito di sintassi. – Tomalak
Il tuo commento sembra uno scherzo. – mammadalius
Vedi uno smile dietro? Non ho l'abitudine di scrivere commenti di battute su più righe. – Tomalak