Presumo che quando hai posto nuovamente la domanda, desideri una sintassi che funzioni sia su Oracle che su SQL Server anche se inevitabilmente influirà su una sola tabella.
Il codice standard SQL-92 entry level è supportato da entrambe le piattaforme, pertanto il seguente codice SQL-92 "scalar subquery" dovrebbe funzionare:
UPDATE table1
SET my_value = (
SELECT t2.tab1_id
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
)
WHERE id = 1234
AND EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);
Si noti che durante l'utilizzo del nome di correlazione t1
per Ttble1
è sintassi valida secondo lo standard SQL-92 questo materializzerà una tabella e il UPDATE
punterà quindi alla tabella materializzata 't1' e lascerà inalterata la tabella di base 'table1', che presumo non sia l'effetto desiderato. Anche se sono abbastanza sicuro che sia Oracle che SQL Server non siano conformi a questo riguardo e che in pratica funzionerebbero come previsto, non c'è nulla di male nell'essere estremamente cauti e attenersi alla sintassi SQL-92 qualificando completamente la tabella di destinazione.
La gente tende a non apprezzare il codice "ripetuto" nelle sottoquery precedenti (anche se l'ottimizzatore dovrebbe essere abbastanza intelligente da valutarlo solo una volta).
Le versioni più recenti di Oracle e SQL Server supportano entrambe lo standard SQL:2003 MERGE
sintassi, potrebbe essere in grado di utilizzare qualcosa di simile a questo:
MERGE INTO table1
USING (
SELECT t2.tab1_id
FROM table2 AS t2
) AS source
ON id = source.tab1_id
AND id = 1234
WHEN MATCHED THEN
UPDATE
SET my_value = source.tab1_id;
Ho appena notato che il tuo esempio è ancora più semplice di quanto pensassi all'inizio e richiede semplicemente una semplice sottoquery che dovrebbe essere eseguita sulla maggior parte dei prodotti SQL, ad es.
UPDATE table1
SET my_value = 'foo'
WHERE EXISTS (
SELECT *
FROM table2 AS t2
WHERE t2.tab1_id = table1.id
);